如何提高爬蟲效率?Python下簡單的進程、線程效率對比

在爬取海量的網路數據時,一方面我們需要確保爬蟲不被網站伺服器封掉,一方面也要提高爬蟲的採集效率。

避免爬蟲不被封掉,一般我們通過大量的代理IP構成代理池,通過代理來訪問採集的網站,而對於如何提高爬蟲的採集效率,就有很多種方法,比如:使用多進程、多線程、分散式、協程等等。

個人在實際的爬蟲使用中,出於個人喜好和硬體條件,一般使用多進程和多線程。

下面,我們通過一個簡單的例子,來對比一下,在普通情況下、使用多進程、使用多線程的情況下程序的運行效率:

遍歷網址URL是爬蟲中很常見的一個場景,我們使用一個列表模擬對URL的遍歷:

from multiprocessing import Poolnfrom multiprocessing.dummy import Pool as TheaderPooln

首先是使用for循環:

def test1():n for n in range(10000):n for i in range(100000):n n += in%time test1()n

返回結果:

Wall time: 1min 15sn

使用兩個for循環分別遍歷10000次,一共花費了15秒的時間

接著,我們看看一個使用for循環,一個使用多線程的情況,由於熟悉程度的原因,在此使用的是multiprocessing.dummy模塊中的Pool方法進行多線程,而非Threading模塊:

def test4():n for n in range(100000):n def test5(i):n n += in tpool = TheaderPool(processes=1)n tpool.map_async(test5,range(100000))n tpool.close()n tpool.join()nn%time test4()n

返回結果為:

Wall time: 118 msn

只花費了118毫秒。

下面再看看使用多進程的情況:

def test2():n for n in range(100000):n def test3(i):n n += in pool = Pool(processes=1)n pool.map_async(test3,range(100000))n pool.close()n pool.join()n%time test2()n

所花費的時間為:199毫秒

Wall time: 199 msn

在這個簡單的對比例子中,可以發現,不管是使用多線程還是多進程,多線程直接提高了一百餘倍,多進程雖然比多線程慢一點點,但也有近一百倍的提高,都能夠大幅地提高循環遍歷的效率,當然,在實際的數據採集過程中,還要考慮網速和響應的問題,也需要考慮自身機器的硬體情況,來設置多進程或多線程。

======================================================================

微信公眾號:州的先生,同步更新

推薦閱讀:

windows下anaconda 安裝報錯, errno9,怎麼解決?
國內最火的11個Python開源項目
[3] Python數值
用Python實現貝葉斯定理
Flask框架從入門到實戰

TAG:Python | 爬虫计算机网络 | 编程 |