如何提高爬虫效率?Python下简单的进程、线程效率对比

浏览: 1671


在爬取海量的网络数据时,一方面我们需要确保爬虫不被网站服务器封掉,一方面也要提高爬虫的采集效率。

避免爬虫不被封掉,一般我们通过大量的代理IP构成代理池,通过代理来访问采集的网站,而对于如何提高爬虫的采集效率,就有很多种方法,比如:使用多进程、多线程、分布式、协程等等。

个人在实际的爬虫使用中,出于个人喜好和硬件条件,一般使用多进程和多线程。

下面,我们通过一个简单的例子,来对比一下,在普通情况下、使用多进程、使用多线程的情况下程序的运行效率:

遍历网址URL是爬虫中很常见的一个场景,我们使用一个列表模拟对URL的遍历:

from multiprocessing import Pool
from multiprocessing.dummy import Pool as TheaderPool

首先是使用for循环:

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

返回结果:

Wall time: 1min 15s

使用两个for循环分别遍历10000次,一共花费了15秒的时间

接着,我们看看一个使用for循环,一个使用多线程的情况,由于熟悉程度的原因,在此使用的是multiprocessing.dummy模块中的Pool方法进行多线程,而非Threading模块:

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

%time test4()

返回结果为:

Wall time: 118 ms

只花费了118毫秒。

下面再看看使用多进程的情况:

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

所花费的时间为:199毫秒

Wall time: 199 ms

在这个简单的对比例子中,可以发现,不管是使用多线程还是多进程,多线程直接提高了一百余倍,多进程虽然比多线程慢一点点,但也有近一百倍的提高,都能够大幅地提高循环遍历的效率,当然,在实际的数据采集过程中,还要考虑网速和响应的问题,也需要考虑自身机器的硬件情况,来设置多进程或多线程。

http://zmister.com 同步更新

推荐 0
本文由 州的先生 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册