Python 爬蟲 (五) --多執行緒續 (Queue )

發表於2017-08-27

本文希望達到的目標:

  1. 學習Queue模組
  2. 將Queue模組與多執行緒程式設計相結合
  3. 通過Queue和threading模組, 重構爬蟲, 實現多執行緒爬蟲,
  4. 通過以上學習希望總結出一個通用的多執行緒爬蟲小模版

1. Queue模組

Queue模組實現了多生產者多消費者佇列, 尤其適合多執行緒程式設計.Queue類中實現了所有需要的鎖原語(這句話非常重要), Queue模組實現了三種型別佇列:

  • FIFO(先進先出)佇列, 第一加入佇列的任務, 被第一個取出
  • LIFO(後進先出)佇列,最後加入佇列的任務, 被第一個取出(操作類似與棧, 總是從棧頂取出, 這個佇列還不清楚內部的實現)
  • PriorityQueue(優先順序)佇列, 保持佇列資料有序, 最小值被先取出(在C++中我記得優先順序佇列是可以自己重寫排序規則的, Python不知道可以嗎)

1.1. 類和異常

1.2. Queue物件

三種佇列物件提供公共的方法

下面是官方文件給多出的多執行緒模型:

2. Queue模組與執行緒相結合

簡單寫了一個Queue和執行緒結合的小程式

3. 重構爬蟲

主要針對之間寫過的豆瓣爬蟲進行重構:

3.1. 豆瓣電影爬蟲重構

通過對Queue和執行緒模型進行改寫, 可以寫出下面的爬蟲程式 :

完整程式碼請檢視Github豆瓣多執行緒爬蟲
完成這個程式後, 又出現了新的問題:

無法保證資料的順序性, 因為執行緒是併發的, 思考的方法是: 設定一個主執行緒進行管理, 然後他們的執行緒工作

4. 通用的多執行緒爬蟲小模版

下面是根據上面的爬蟲做了點小改動後形成的模板

我感覺其實這個多執行緒挺凌亂的, 希望以後自己能重構

5. 思考更高效的爬蟲方法

  • 使用twisted進行非同步IO抓取
  • 使用Scrapy框架(Scrapy 使用了 Twisted 非同步網路庫來處理網路通訊)

6. 參考連結

相關文章