1樓:深海淺港少女與夢
使用多執行緒是因為get頁面所需時間非常長,是後面步驟的幾十上百倍,所以,後面的步驟用不用多執行緒都不是問題。
另外:node-crawler寫爬蟲好寫不累,一口氣寫5個不喘氣,誰用誰知道!
2樓:笑虎
假設乙個爬蟲步驟分為:獲取,解析,儲存。那麼在設計多執行緒爬蟲時應該是乙個執行緒完成這三個步驟,然後執行多個執行緒,還是應該每個執行緒完成乙個步驟。
這裡的兩種思路都不是最好的。
對於Python來說,多執行緒並不能並行執行,而是通過快速的多執行緒切換,讓使用者感覺是並行執行的。這裡自薦一篇我的專欄文章:Python高階:
聊聊IO密集型任務、計算密集型任務,以及多執行緒、多程序。通過這篇文章,你就會大概了解Python中多執行緒、多程序的使用場景。
「獲取」和「儲存」是IO密集型任務,而「解析」大部分是計算密集型任務。
所以,比較合理的思路應該是,N個執行緒進行「獲取」、乙個執行緒進行「解析」、乙個執行緒進行「儲存」。具體思路可參考:擁有屬於自己的Python爬蟲框架--練習編寫多執行緒、協程爬蟲框架。
如果多執行緒與多程序配合,邏輯又應該怎樣呢?
除非你的「解析」任務非常重,否則不建議使用多程序。如果非要配合使用,我的思路是這樣的:
(1)主程序負責排程,共fork出「大於三個」子程序--抓取程序1個、解析程序N個、儲存程序1個。
(2)1個抓取程序生成多個抓取子執行緒,負責抓取任務。
(3)多個解析程序分別負責解析不同的網頁內容,同時將得到的新的URL傳給抓取程序。
(4)儲存程序負責儲存任務。
還是那句話:除非你的「解析」任務非常重,否則不建議使用多程序。因為程序之間的資料通訊比較複雜,也不一定能保證一定正確。
而且大部分爬蟲的瓶頸,是在如何正確的獲取網頁內容、如何反反爬等,而不是速度問題。如果非要追求速度,建議使用分布式爬蟲。
常用的多執行緒多程序爬蟲應該如何設計?
參考:擁有屬於自己的Python爬蟲框架--練習編寫多執行緒、協程爬蟲框架。
另外,python中除了多執行緒、多程序之外,還有「協程」的概念,建議你了解一下。
參考:Python高階:理解Python中的非同步IO和協程(Coroutine),並應用在爬蟲中
3樓:黃哥
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 密集運算方面.
多執行緒爬蟲如何停止?
八爪魚採集器 你每次抓取完不都是有狀態的,404,301,200之類的,來判斷你是否這一位址是否採集完成 你要廣度還是深度,都是有層級的,這就讓你總的鏈結是可控的你應該得有佇列池的概念,重試的概念 另外,這問題描述得真不清楚,建議你看一下搜尋引擎原理吧 cloudy 按照你的設計思路,看起來是每個w...
Python 多執行緒效率不高嗎?
小強很忙忙 python受到GIL保護,在同一時刻,只有一條執行緒可以向前執行。原因 python的標準實現是cpython,在執行python程式時為了防止cpython受到先佔式多執行緒切換,破壞直譯器的狀態,所以加上GIL 全域性鎖直譯器 來保持位元組碼直譯器的協調性。之所以支援多執行緒 1....
關於多執行緒程式設計和CPU多核多執行緒的關係?
佐佐浪 具體到你的例子,修改優先順序和修改時間片是無法達到這個效果的。你需要做的是把你的計算部分做成並行的。單獨乙個執行緒是達不到你要的效果的。 棒子先生 首相我們了解下為什麼需要用到4核,這是由於不能盲目的提高CPU的主頻和頻寬,這樣會產生各種實際很難處理的問題,比如溫度飆公升等。舉例來說我們需要...