anete-lusina-382329-unsplash
 程式與統計資料處理

網路爬蟲 Web Crawler | 資料不求人 基礎篇 | using Python BeautifulSoup

料理一道菜必須要有好的食材,就像豐富有趣的資料是好的資料分析基礎。有時為了有效蒐集我們感興趣的資料,我們得自己寫網路爬蟲(web crawler)。本篇文章將示範如利用python的 requestsBeautifulSoup 套件抓取網頁上感興趣的資料。我們將以著名的PTT批踢踢網站為例,爬取每日各時點人氣看板與人氣資訊。

 

Step 1: 觀察網頁資料

我們的目標網頁是 https://www.ptt.cc/bbs/hotboards.html (PTT 熱門看板)
用瀏覽器打開頁面並按右鍵點觀看網頁原始碼會看到以下內容:

我們可以看到這個網頁的HTML結構,以及我們想爬取的資料如 (看板名稱當前看板人氣…等) 所在的Elements.

例如我們想爬取這個網頁中所有出現的看板名稱,而這些資料所在的 Element 是一個

,並且用一個 “board-name” 來指定套用樣式,所以我們就可以找出所有的 class 是 “board-name” 的
Element。

有了策略之後,我們就可以把網頁自動下載下來,並用 BeautifulSoup 對 HTML 進行解析來快速取出我們想要的部分。

step 2: 自動下載網頁原始碼

以往我們必續手動打開頁面,檢視網頁原始碼,按右鍵儲存。
但我們希望可以利用機器自動抓取,之後就能設定時間,使它每隔一段時間抓取一次。
在python中,我們可以利用 requests 套件自動地抓取網頁原始碼。

step 3: 解析HTML原始碼

我們使用著名的BeautifulSoup套件來解析原始碼。並取出我們想要的部分。

會得到一個list of elements, 順序為他們在原始網頁程式碼出現的順序

將每個element的文字部分(看板名稱)取出

會得到一個 list of strings

上面已經將網頁中出現的看板名稱依序取出了, 也可以依樣畫葫蘆將當下的看板人氣也依序取出:

會得到list of integers

爬完囉! 秀出結果來看看吧

step 4: 爬蟲結果輸出

將 data 輸出到sqlite 儲存

在SQLite中create table

使用for迴圈,逐列將資料一筆一筆insert到”records” table中, 並紀錄每一筆資料對應的時間點.

查看table內容

最後記得關閉連線。

小結

要如何爬取資料內容,其實跟該網頁的HTML架構(網頁原始碼)有關,即使同一個網頁也可以有許許多多種的爬取策略
因為範例的目標網頁非常簡單,故這邊只是用非常簡單的方式取得各看板名稱及相對應的人氣值。
另外有些更複雜的網頁可能不是把資料呈現在原始碼中的,就得需要用其他更進階的方法才能爬取囉。

後續可以用任何方式定期跑這個script (例如每10分鐘跑一次), 就可以不斷的紀錄PTT熱門看板人氣隨時間的變化.
輔以視覺化工具呈現後, 預期可以看到地震時八卦版會瞬間湧入人潮; NBA板隨著季賽開打而常駐熱門前三名…等等.

 


下篇筆記是關於如何將每隔一段時間爬取資料儲存到SQLite,最後做個視覺化的展示:

使用R連接SQLite取得資料集

更多Python網路爬蟲學習筆記:

網路爬蟲 Web Crawler | 資料不求人 基礎篇 | using Python BeautifulSoup

網路爬蟲 web crawler | 奇摩電影 yahoo movies | using Python

Text Mining & 網路爬蟲 web crawler | Google新聞與文章文字雲 | Python

參考:

Python網路爬蟲:大數據擷取、清洗、儲存與分析:王者歸來