高性能异步爬虫     

目的:在爬虫中使用异步实现高性能的数据爬取操作

 

异步爬虫的方式:

-多线程,多进程(不建议):

好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作旧可以异步执行。

弊端:无法无限制的开启多线程或者多进程。

                                                    

-线程池、进程池(适当的使用):

好处:我们可以降低系统对进程或者线程创建和销毁频率,从而很好的降低系统的开销。

弊端:池中线程或进程的数量是有上限。

 

1、使用单线程串行方式执行

 1 import time
 2 #使用单线程串行方式执行
 3 
 4 def get_page(str):
 5     print("正在下载:",str)
 6     time.sleep(2)
 7     print("下载成功:",str)
 8 
 9 name_list=['xiaozi','aa','bb','cc']
10 
11 start_time=time.time()
12 
13 for i in range(len(name_list)):
14     get_page(name_list[i])
15 
16 end_time=time.time()
17 
18 print('%d second'%(end_time-start_time))

执行结果如下:

 

 2、使用线程池方式执行

 1 import time
 2 #导入线程池模块对应的类
 3 from multiprocessing.dummy import Pool
 4 #使用线程池方式执行
 5 start_time=time.time()
 6 def get_page(str):
 7     print("正在下载:",str)
 8     time.sleep(2)
 9     print("下载成功:",str)
10 
11 name_list=['xiaozi','aa','bb','cc']
12 
13 #实例化一个线程池对象
14 pool=Pool(4)
15 #将列表中每一个列表元素传递给get_page进行处理
16 pool.map(get_page,name_list)
17 
18 end_time=time.time()
19 print(end_time-start_time)

执行结果:

 

 可以明显看出,使用线程池的方式大大提高执行效率