天天看點

爬蟲實戰(一)爬取靜态頁面資料

作者:阿甘coding

前言

我們以一個靜态網站作為案例進行練習,網站連結為:https://ssr1.scrape.center/,這個網站裡面包含一些電影資訊。網站首頁如下圖所示:

爬蟲實戰(一)爬取靜态頁面資料

我們點選其中一部電影,會進入該電影的詳情頁面,如下圖所示:

爬蟲實戰(一)爬取靜态頁面資料

我們需要爬取的資訊為每部電影的名稱、封面、類别、上映時間、評分、劇情介紹等内容,并把爬取的内容儲存為JSON 文本檔案,并使用多程序實作爬取加速;。

爬取過程

這個網站有10個清單頁,每個清單頁有有10部電影,可以先爬取清單頁的資訊,從擷取到的資訊中擷取詳情頁的URL,進而擷取每部電影詳情頁的資訊,對爬取的資訊用正規表達式擷取自己需要的資料,最後将資料儲存在檔案中。

爬取清單頁

我們首先觀察清單頁的結構和翻頁規則,在浏覽器中通路https://ssr1.scrape.center/,然後打開浏覽器開發者工具,如下圖所示:

爬蟲實戰(一)爬取靜态頁面資料

發現每部電影對應的區塊都是一個 div節點,這些節點的class 屬性中都有 el-card這個值,每個清單頁有10個這樣的div節點,也就是10部電影資訊。每部電影名稱外面都套有一個 a節點,這個a節點帶有 href屬性,這就是進行詳情頁的超連結。第一部電影 href的值為/detail/1,加上網站的根 URL 就構成了 https://ssr1.scrape.center/detail/1,這就是這部電影詳情頁的URL。通過觀察每個清單頁的URL,發現從第二頁開始,清單頁URL多了/page/2這部分,2為某一頁的頁碼。

到這裡,邏輯基本清晰了,我們要完成清單頁的爬取,可以這麼實作:

1、周遊所有頁碼,構造 10 頁的清單頁 URL;

2、從每個清單頁,分析提取出每個電影詳情頁的 URL;

從代碼層面需要這樣做:

1、首先引入一些必要的庫和定義一些基礎變量,再編寫一個函數完成一個頁面的爬取:

爬蟲實戰(一)爬取靜态頁面資料

2、編寫一個函數自動生成每個清單頁的 URL并傳回爬取結果;

爬蟲實戰(一)爬取靜态頁面資料

3、編寫一個函數來解析清單頁,擷取每部電影詳情頁的 URL;.

爬蟲實戰(一)爬取靜态頁面資料

到此,清單頁抓取完成。

爬取詳情頁

首先打開一個詳情頁的頁面源碼,分析要擷取資訊的節點,然後再使用正規表達式擷取自己想要的資訊,定義一個爬取詳情頁的方法,實作如下:

爬蟲實戰(一)爬取靜态頁面資料

然後定義一個解析詳情頁的方法,它接收一個參數為html,解析其中的内容并以字典的形式傳回, 實作如下:

爬蟲實戰(一)爬取靜态頁面資料

儲存資料

成功提取詳情頁資訊後,下一步就是儲存資料,這裡将資料儲存為文本形式,如下所示:

爬蟲實戰(一)爬取靜态頁面資料

這裡我們首先定義儲存資料的檔案夾RESULTS_DIR,然後判斷這個檔案夾是否存在,如果不存在則建立一個。接着我們定義儲存資料的方法save_data,将資料以json形式儲存。

最後定義一個總的調用方法main,将之前的方法整合在一起,如下所示:

爬蟲實戰(一)爬取靜态頁面資料

多程序加速

由于爬取是單線程的,而且隻能逐條爬取,是以速度比較慢,可以對爬取過程進行優化,使用多程序爬取,具體實作代碼如下:

爬蟲實戰(一)爬取靜态頁面資料

我們首先給main方法添加了一個參數page,用以表示清單頁的頁碼,接着聲明一個程序池,最後程序池的大小根據我們的機器cup的核數,如果有8個核,則會有8個程序并行運作。

測試結果

腳本輸出結果如下:

爬蟲實戰(一)爬取靜态頁面資料

儲存的資料如下:

爬蟲實戰(一)爬取靜态頁面資料

繼續閱讀