Python爬蟲案例:抓取豆瓣程式設計類高評分書籍
對於很多正在學習計算機的朋友來說,選擇合適的學習材料是非常重要的。
本文將通過 Python 來爬取豆瓣程式設計類評分大於 9.0 的書籍。
此案例很適合入門爬蟲的朋友學習,總共也就 3 個函式。
下圖是最終的結果:
下面進入正題:
一、採集源分析:
首先我們找到豆瓣的程式設計類書籍網址:
進入網址之後我們翻到最下面的分頁導航:
通過分析分頁地址我們可以得出:
這個地址則是我們要採集的內容。第一頁 start = 0,第二頁 start = 20 … 以此類推。
找到了要採集的 URL 之後,接下來就是分析我們真正需要的資料在 HTML 文件中的位置。
F12 開啟控制檯發現,這些 li 標籤正是我們的目標內容。
見下圖:
有了以上內容,那麼我們很容易就有了思路:
- 抓取頁面上所有的 li 標籤
- 迴圈處理這裡 li 標籤,找到我們所需的三個內容,並存儲到列表中
- 根據評分排序
- 儲存資料到 csv
二、依賴的包:
除了上次使用到的 requests, BeautifulSoup, 還增加了幾個包。
- re 正則表示式處理
- numpy 很強大的資料處理庫,因為本文要進行排序,所以使用這個包會很方便
- csv 用於把最終的結果儲存到csv中
- time 這裡主要用到了 sleep 功能
三、編碼
- 首先我們定義一個 get 函式,接受一個頁碼,表示要爬取到多少頁。 這個函式的主要功能就是抓取指定頁碼所有的書的資訊,包括書名、評分、評論數。並且儲存到一個二維陣列中。
程式碼解讀:
因為豆瓣的分頁是根據 URL 中的 start 引數(相當於偏移量)來分的,所以在剛開始定義了一個 offset 變數,根據我們傳入的頁碼來計算正確的 start 引數的值。
後面通過 find_all 方法獲取所有的 li 物件,存入 book_info_list 列表中,那麼接下來就是遍歷這個列表,從每一個元素中得到 star、 title、comment 三個變數。最終得到一個二維陣列 result。
-
定義排序方法,接收上面得出的 result 變數,並且將這個列表根據評分來排序。
-
將最終排好的資料寫入 csv 中。
四、總結
以上則是我們爬取豆瓣的小案例,有經驗的朋友們會發現這個案例有很大的不足之處。
在執行這個程式的時候,我們會發現會非常緩慢。原因就是每次請求豆瓣的分頁 URl 之後,接下來緊跟著一條龍的獲取書名等操作,獲取完這個頁面的所有資料之後再接著抓取下一個分頁頁面。也就是完全同步的編碼方式。所以慢是必然的。
那麼如何調整程式碼結構才能使程式執行迅速呢?
這裡介紹一個簡單又常用的方法:
我們可以採用多執行緒技術,python 的 threading 包是專門用於多執行緒處理的。採用這種方式又多增加了兩個包:
- threading
- queue
可以將上述程式碼的下載分頁 URL 部分程式碼放入一個單獨的執行緒去跑,並將下載好的 HTML 文件存入一個佇列中。然後多開幾個執行緒去佇列中讀取資料,並用 BS4 來分析,將分析得到的 list 資料結構追加到外部的另一個list 中。最後再去排序這另一個列表。