python多線程爬蟲設計?

假設一個爬蟲步驟分為:獲取,解析,存儲。那麼在設計多線程爬蟲時應該是一個線程完成這三個步驟,然後運行多個線程,還是應該每個線程完成一個步驟。
如果多線程與多進程配合,邏輯又應該怎樣呢?
常用的多線程多進程爬蟲應該如何設計?
註:不使用爬蟲框架


謝邀!

估計提問者和我一樣,不太喜歡使用現成的爬蟲框架,想自行設計一個。如果不嫌棄,可以參考我專欄中的幾篇文章(下邊的回答中會給出地址),以及Github上自定義的一個極為簡潔的爬蟲框架:xianhu/PSpider。這裡繼續回答問題。

假設一個爬蟲步驟分為:獲取,解析,存儲。那麼在設計多線程爬蟲時應該是一個線程完成這三個步驟,然後運行多個線程,還是應該每個線程完成一個步驟。

這裡的兩種思路都不是最好的。

對於Python來說,多線程並不能並行執行,而是通過快速的多線程切換,讓使用者感覺是並行執行的。這裡自薦一篇我的專欄文章:Python進階:聊聊IO密集型任務、計算密集型任務,以及多線程、多進程。通過這篇文章,你就會大概了解Python中多線程、多進程的使用場景。

「獲取」和「存儲」是IO密集型任務,而「解析」大部分是計算密集型任務。

所以,比較合理的思路應該是,N個線程進行「獲取」、一個線程進行「解析」、一個線程進行「存儲」。具體思路可參考:擁有屬於自己的Python爬蟲框架--練習編寫多線程、協程爬蟲框架。

如果多線程與多進程配合,邏輯又應該怎樣呢?

除非你的「解析」任務非常重,否則不建議使用多進程。如果非要配合使用,我的思路是這樣的:

(1)主進程負責調度,共fork出「大於三個」子進程--抓取進程1個、解析進程N個、存儲進程1個。

(2)1個抓取進程生成多個抓取子線程,負責抓取任務。

(3)多個解析進程分別負責解析不同的網頁內容,同時將得到的新的URL傳給抓取進程。

(4)存儲進程負責存儲任務。

還是那句話:除非你的「解析」任務非常重,否則不建議使用多進程。因為進程之間的數據通信比較複雜,也不一定能保證一定正確。而且大部分爬蟲的瓶頸,是在如何正確的獲取網頁內容、如何反反爬等,而不是速度問題。如果非要追求速度,建議使用分散式爬蟲。

常用的多線程多進程爬蟲應該如何設計?

參考:擁有屬於自己的Python爬蟲框架--練習編寫多線程、協程爬蟲框架。

另外,python中除了多線程、多進程之外,還有「協程」的概念,建議你了解一下。

參考:Python進階:理解Python中的非同步IO和協程(Coroutine),並應用在爬蟲中


1、一般多線程用在http 訪問的這一步即可。(也就是你說的獲取url的pagesource)

2、如果是Python3 可以用
18.5. asyncio - Asynchronous I/O, event loop, coroutines and tasks - Python 3.6.0 documentation

3、如果是Python 可以用What is gevent? - gevent 1.2.2dev0 documentation

4、多進程主要用在CPU密集運算方面,多線程主要用在I/O 密集運算方面.


使用多線程是因為get頁面所需時間非常長,是後面步驟的幾十上百倍,所以,後面的步驟用不用多線程都不是問題。

另外:node-crawler寫爬蟲好寫不累,一口氣寫5個不喘氣,誰用誰知道!


推薦閱讀:

學習爬蟲應該從哪裡學起?
如何用八爪魚採集器提取新浪微博的數據呢?
如何利用python asyncio編寫非同步爬蟲?
python抓取網易財經的個股的財務數據,比如利潤表,並分項保存到mysql,需要哪些步驟?
啟信寶的查詢功能是如何實現的?

TAG:Python | 爬蟲計算機網路 |