如何讓你的Python爬蟲採集得更快

如何讓你的Python爬蟲採集得更快

轉自:http://www.site-digger.com/html/articles/20131019/69.html

    鯤鵬數據的技術人員長期從事Python爬蟲的開發工作,如何讓Python爬蟲採集的更快,如何處理海量數據的下載是我們一直探索和研究的對象。下面是我們從數學角度給出的一些分析以及我們的一些經驗分享。

    假設線程數爲n,線程中下載平均用時爲td,線程中數據處理部分(純計算)用時爲tc。由於單個Python進程只能使用單CPU核心,因此總的數據處理耗時應是各線程tc的累加即n*tc。因爲下載是阻塞操作,CPU可以幾乎同時處理所有下載,因此總的下載耗時就近似爲td。那麼Python爬蟲的下載速度應爲:
    
    等式稍作變換後爲:
    
    對於特定的網站td爲定值(常量),對於特定的數據處理算法tc也近似爲定值。所以下載速度的最大值也不會超過1/tc。試想一下,如果線程函數內數據處理部分耗時爲0.1秒,那麼不管線程數再大,整體的速度也不會超過10個/秒。線程數n的增大的確能夠使得v增大,但是如果tc值較大,n的值達到一定程度後對v的影響就很小了。假設tc = 0.1,td = 3,那麼 v = 1/(0.1+3/n)的函數圖象應爲如下圖所示:
    
 
    由圖可以看出當n在100以後對v的影響就不大了。因此不能盲目的增大線程數n。線程數越大消耗的系統資源就越多,同時過多的CPU切換反而會增加整體花費的時間。
    如何讓你的爬蟲跑的更快呢?通過上面的分析我們知道單個Python爬蟲進程最大速度爲1/tc。如果我們同時啓動m個進程,那麼整體的速度就能提高m倍。但是m的值也不是越大越好,因爲進程的系統開銷比線程還要大。一般進程數取CPU的核心數的爲宜(具體可視實際CPU使用率情況調整)。
    如下圖所示,爲我們在一4核機器上同時啓動4進程的情況。只啓動一個進程時速度最大僅爲13個/秒,同時啓動4個進程,整體的速度就達到約50個/秒。
    
    另外,Python雖然有multiprocessing庫,但是我們實際測試其速度遠沒有真正的多個獨立進程快。因此建議用真正的“多進程”。
    多進程的設計增加了程序的開發難度。主要要解決兩大問題:
    一、輸入(任務隊列)。多進程要共享一個任務隊列。如果該任務隊列方案支持網絡,那麼就很容易把採集系統做成真正的分佈式集羣採集。
    二、輸出。簡單的做法就是直接把數據寫入數據庫,但是在爬蟲程序內頻繁操作數據庫勢必會增加耗時。一個較好的方案是將輸出先寫入消息隊列,然後用一單獨進程來處理消息隊列。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章