1. 程式人生 > >自學Python之路--入門菜鳥的菜鳥篇:爬蟲

自學Python之路--入門菜鳥的菜鳥篇:爬蟲

第一次寫部落格&第一次自學Python&第一次實戰

Hi,親們,本部落格只是個人瞎寫著記錄的:

  • 作為已經做BI工程師三年的人竟然第一次接觸Python,自學Python 哎~~是不是很晚呢
  • 畢業第一年進入SAP BW模組
  • 第二年已經差不多開始懂點什麼是資料建模,什麼是資料倉庫,資料集市
  • *第三年在公司開始做ETL,資料清洗,資料整合,報表展示

到目前所使用過的資料庫:
SAP HANA,SQL server,Greenplum,Mysql,Hadoop,MongoDB,Oracle**

所使用過的BI工具:
SAP BO,Tableau,PowerBI,Microsoft CUBE,Tabular等

唯獨目前最火的Python,R等語言 一次都沒接觸過,因此藉此正好有空閒時間來自學一下Python

入門學習篇

  1. 先明確學習的內容:爬蟲!!
    去各種網站搜Python自學教學等教材。
    最好用的還是 w3cschool的資料,不懂得問題直接去Bing搜,就是這麼簡單粗暴

  2. 邊學習邊應用:
    個人是比較習慣於一一邊學習一邊實戰的方式。所以一邊學習爬蟲相關的庫, 一邊直接應用

  3. 學習到的庫:
    BS4
    urlopen
    pyhdb
    datetime
    requests
    re
    也不能說是學完了,應該是有一點點知道了怎麼應用,網上資料很多,不懂直接去Bing搜就出來一堆東西啦~哈哈哈哈

  4. 選定一個目標就直接實戰:
    稱為我獵物的是某DM論壇。(因為個人比較喜歡遊戲)

廢話不多說下面就獻醜自己亂寫的程式碼,因為沒有考慮效率問題,希望能得到更好的建議

實戰篇

分析

  • 先進入論壇首頁,分析網站結構,找出規律

    1、發現搜尋列右邊已經給出所有遊戲類目,找到定位就更簡單了。
    把所有類目都放在class=”scbar_hot_td”下的id=”scbar_hot”下 class=‘xi2’
    Href=後面直接有每個類目地址
    這裡寫圖片描述

2、開啟每個類目地址又發現一個很有規律性的邏輯~~哈哈太有趣
每個類目下都按一定規律寫了遊戲論壇地址和名稱,讓我更簡單的利用爬蟲來爬取資料提供了很強大的支援。

這裡寫圖片描述

這裡寫圖片描述

3、進入每款遊戲論壇地址也一樣,都按一定規律編寫每個帖子的基本資訊

比如class=”new” 存放帖子型別、帖子標題、熱度等資訊
class=”by”存放建立者建立日期、最後回覆人以及最後回覆日期等
class=”num”存放檢視數、回覆次數

這裡寫圖片描述

編寫Python

提取每款遊戲資訊:

def getgrand(url):

#URL就是網頁地址
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}  # 設定標頭檔案資訊 #
response = requests.get(url, headers=headers).content  # 提交requests get 請求
soup = BeautifulSoup(response, "html.parser")  # 用Beautifulsoup 進行解析
commid = soup.findAll('a', class_='xi2') ##這裡找出所有xi2類
for commid2 in commid[2:-1]: ##爬取論壇首頁
    href=commid2.get("href") ##這裡要抽取每個遊戲類目地址
    if len(href.split("-"))>=2 :
        id=href.split("-")[1] ##這裡要抽取每個類目ID,後面做資料模型的時候用
        site=url+href  #完整的遊戲類目地址
        print(site)
        cate=commid2.text   #這裡要抽取每個遊戲類目名稱
        if check_contain_chinese(cate) == True:  ## 相當於資料清洗,因為抽取有可能不是類目名稱,排除不是中文的名稱
            response2 = requests.get(site, headers=headers).content  # 提交requests get 請求
            soup2= BeautifulSoup(response2, "html.parser")  # 用Beautifulsoup 進行解析
            catmid=soup2.findAll('dt')
            intohana_grandcat(conn, id, cate, site)##匯入到HANA資料庫裡 建立類目維表
            # print(catmid)
            # print(cate)
            for catmid2 in catmid: ##爬取每個遊戲首頁 
                a=catmid2.findAll("a")[0]
                href2=a.get("href")
                gamename=a.text  ## 提取遊戲名稱
                # print(gamename)
                if (len(href2.split("-"))>=2) & (href2[-4:]=="html") :    ##資料清洗,清理垃圾資料
                    site2=url+href2  ## 提取出每款遊戲地址
                    id2=href2.split("-")[1]  ##每款遊戲ID

            #         print(a)
            #         print(id2)
            #         print(site2)
                    intohana_game(conn, id, cate, id2, gamename, site2)  ###建立遊戲維度維表
                    getdetail(site2,conn,id,id2,gamename)  ## get detail of blog information ##要爬取每個遊戲論壇地址

爬取每個遊戲論壇地址:

def getdetail(site,conn,GRAND_ID,GAME_ID,GAME_NAME): ## get detail of blog information

globals()   #定義所用到的所有全域性變數
type=''
theme=''
replynum=''
readnum=''
editor=''
createdate=''
lastreply=''
lastreplydate=''

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}  # 設定標頭檔案資訊 #

response3 = requests.get(site, headers=headers).content  # 提交requests get 請求
soup3 = BeautifulSoup(response3, "html.parser")  # 用Beautifulsoup 進行解析
gamemid = soup3.findAll('th', class_='new')  
td = soup3.findAll('td', class_='by')
for tbody in soup3.findAll('tbody'):   ##對每個tbody進行解析
    for tr in tbody.findAll('tr'):   ##對每個tbody的tr進行解析
        for new in tr.findAll('th', class_='new'):  ##對每個tbody的tr下class_=new進行解析
            em = new.find('em')    #抽取帖子型別
            if em:    ##資料清洗
                type = em.text[1:-1]
            else:
                type = ''
            theme = new.find('a', class_='s xst').text #抽取帖子主題
            num = tr.find('td', class_='num')  ###get reply & read #抽取帖子檢視和回覆次數
            if num:  ##資料清洗
                replynum = num.find('a').text 
                readnum = num.find('em').text
            else:
                replynum='0'
                readnum='0'
            # print(type, theme, replynum, readnum)
        by = tr.findAll('td', class_='by')  # get editor & date #抽取每個帖子 建立者和最後回覆人
        if by: ##資料清洗
            for uby in by[:1]:  # get editor & date
                createdate = uby.find('em').text
                editor = uby.find('cite').text
            # print(editor,createdate)
            for uby in by[1:]:  # get editor & date
                lastreply = uby.find('cite').text
                lastreplydate = uby.find('em').text
            # print(editor, createdate, lastreply, lastreplydate)
            # print(lastreply, lastreplydate)
        intohana_blogdetail(conn,GRAND_ID,GAME_ID,GAME_NAME,type,theme,replynum,
                            readnum,editor,createdate,lastreply,lastreplydate,current_daytime) # 對每條資料逐步insert到資料庫表建立Fact實時表

整個程式碼釋出到GIT上,做了點簡單的現狀分析

簡單分析:

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

工具

PyCharm
SAP HANA
SAP BO
EXCEL

改進

1、不知道怎麼改進程式碼,就感覺做的太粗糙,希望有人指導
2、分析目的不明確,導致抽取的資料沒有目的性。
3、希望有大神能教點分析方法。