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,需要哪些步驟?
※啟信寶的查詢功能是如何實現的?