下圖是最終的結果:
python
首先咱們找到豆瓣的編程類書籍網址:正則表達式
https://book.douban.com/tag/編程
進入網址以後咱們翻到最下面的分頁導航:
編程
經過分析分頁地址咱們能夠得出:後端
https://book.douban.com/tag/%...{偏移量}&type=T
這個地址則是咱們要採集的內容。第一頁 start = 0,第二頁 start = 20 ... 以此類推。數組
找到了要採集的 URL 以後,接下來就是分析咱們真正須要的數據在 HTML 文檔中的位置。數據結構
F12 打開控制檯發現,這些 li 標籤正是咱們的目標內容。
而書名、評論、評分分別對應li 下面的 h2 標籤、class 爲 rating_nums 的 span 標籤, class 爲 pl 的 span 標籤。多線程
見下圖:
函數
有了以上內容,那麼咱們很容易就有了思路:學習
除了上次使用到的 requests, BeautifulSoup, 還增長了幾個包。編碼
這個函數的主要功能就是抓取指定頁碼全部的書的信息,包括書名、評分、評論數。而且保存到一個二維數組中。
代碼解讀:
由於豆瓣的分頁是根據 URL 中的 start 參數(至關於偏移量)來分的,因此在剛開始定義了一個 offset 變量,根據咱們傳入的頁碼來計算正確的 start 參數的值。
後面經過 find_all 方法獲取全部的 li 對象,存入 book_info_list 列表中,那麼接下來就是遍歷這個列表,從每個元素中獲得 star、 title、comment 三個變量。最終獲得一個二維數組 result。
以上則是咱們爬取豆瓣的小案例,有經驗的朋友們會發現這個案例有很大的不足之處。
在運行這個程序的時候,咱們會發現會很是緩慢。緣由就是每次請求豆瓣的分頁 URl 以後,接下來緊跟着一條龍的獲取書名等操做,獲取完這個頁面的全部數據以後再接着抓取下一個分頁頁面。也就是徹底同步的編碼方式。因此慢是必然的。
那麼如何調整代碼結構才能使程序運行迅速呢?
這裏介紹一個簡單又經常使用的方法:
咱們能夠採用多線程技術,python 的 threading 包是專門用於多線程處理的。採用這種方式又多增長了兩個包:
能夠將上述代碼的下載分頁 URL 部分代碼放入一個單獨的線程去跑,並將下載好的 HTML 文檔存入一個隊列中。而後多開幾個線程去隊列中讀取數據,並用 BS4 來分析,將分析獲得的 list 數據結構追加到外部的另外一個list 中。最後再去排序這另外一個列表。
獲取源碼請到:「 後端漫談 」 公衆號後臺回覆 「douban」。