1. 程式人生 > >如何讓你的Python爬蟲採集得更快

如何讓你的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庫,但是我們實際測試其速度遠沒有真正的多個獨立程序快。因此建議用真正的“多程序”。

    多程序的設計增加了程式的開發難度。主要要解決兩大問題:

    一、輸入(任務佇列)。多程序要共享一個任務佇列。如果該任務佇列方案支援網路,那麼就很容易把採集系統做成真正的分散式叢集採集。

    二、輸出。簡單的做法就是直接把資料寫入資料庫,但是在爬蟲程式內頻繁操作資料庫勢必會增加耗時。一個較好的方案是將輸出先寫入訊息佇列,然後用一單獨程序來處理訊息佇列。