如何提高爬蟲效率?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框架從入門到實戰