1. 程式人生 > >Python爬蟲案例:抓取豆瓣程式設計類高評分書籍

Python爬蟲案例:抓取豆瓣程式設計類高評分書籍

對於很多正在學習計算機的朋友來說,選擇合適的學習材料是非常重要的。
本文將通過 Python 來爬取豆瓣程式設計類評分大於 9.0 的書籍。
此案例很適合入門爬蟲的朋友學習,總共也就 3 個函式。

下圖是最終的結果:

下面進入正題:

一、採集源分析:

首先我們找到豆瓣的程式設計類書籍網址:

進入網址之後我們翻到最下面的分頁導航:

通過分析分頁地址我們可以得出:

這個地址則是我們要採集的內容。第一頁 start = 0,第二頁 start = 20 … 以此類推。

找到了要採集的 URL 之後,接下來就是分析我們真正需要的資料在 HTML 文件中的位置。

F12 開啟控制檯發現,這些 li 標籤正是我們的目標內容。

書名、評論、評分分別對應li 下面的 h2 標籤、class 為 rating_nums 的 span 標籤, class 為 pl 的 span 標籤。

見下圖:

有了以上內容,那麼我們很容易就有了思路:

  1. 抓取頁面上所有的 li 標籤
  2. 迴圈處理這裡 li 標籤,找到我們所需的三個內容,並存儲到列表中
  3. 根據評分排序
  4. 儲存資料到 csv

二、依賴的包:

除了上次使用到的 requests, BeautifulSoup, 還增加了幾個包。

  • re 正則表示式處理
  • numpy 很強大的資料處理庫,因為本文要進行排序,所以使用這個包會很方便
  • csv 用於把最終的結果儲存到csv中
  • time 這裡主要用到了 sleep 功能

三、編碼

  1. 首先我們定義一個 get 函式,接受一個頁碼,表示要爬取到多少頁。 這個函式的主要功能就是抓取指定頁碼所有的書的資訊,包括書名、評分、評論數。並且儲存到一個二維陣列中。

程式碼解讀:

因為豆瓣的分頁是根據 URL 中的 start 引數(相當於偏移量)來分的,所以在剛開始定義了一個 offset 變數,根據我們傳入的頁碼來計算正確的 start 引數的值。

後面通過 find_all 方法獲取所有的 li 物件,存入 book_info_list 列表中,那麼接下來就是遍歷這個列表,從每一個元素中得到 star、 title、comment 三個變數。最終得到一個二維陣列 result。

  1. 定義排序方法,接收上面得出的 result 變數,並且將這個列表根據評分來排序。

  2. 將最終排好的資料寫入 csv 中。

四、總結

以上則是我們爬取豆瓣的小案例,有經驗的朋友們會發現這個案例有很大的不足之處。

在執行這個程式的時候,我們會發現會非常緩慢。原因就是每次請求豆瓣的分頁 URl 之後,接下來緊跟著一條龍的獲取書名等操作,獲取完這個頁面的所有資料之後再接著抓取下一個分頁頁面。也就是完全同步的編碼方式。所以慢是必然的。

那麼如何調整程式碼結構才能使程式執行迅速呢?

這裡介紹一個簡單又常用的方法:

我們可以採用多執行緒技術,python 的 threading 包是專門用於多執行緒處理的。採用這種方式又多增加了兩個包:

  1. threading
  2. queue

可以將上述程式碼的下載分頁 URL 部分程式碼放入一個單獨的執行緒去跑,並將下載好的 HTML 文件存入一個佇列中。然後多開幾個執行緒去佇列中讀取資料,並用 BS4 來分析,將分析得到的 list 資料結構追加到外部的另一個list 中。最後再去排序這另一個列表。