1、异步爬虫
异步爬虫的方式:
(1)多线程,多进程(不建议使用)
好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步执行。
弊端:无法无限制的开启多线程或者多进程。
(2)线程池、进程池
好处:我们可以降低系统对进程或者线程创建和销毁的一个频率,从而很好的降低系统的开销。
弊端:池中线程或进程的数量是有上限。
使用原则:线程池处理的是阻塞且耗时的操作。
2、单线程
# -*-coding = utf-8-*-
import time
from multiprocessing.dummy import Pool
# 线程池使用
if __name__ == '__main__' :
def get_page(str):
print("正在下载: ", str)
time.sleep(2)
print("下载成功: ", str)
name_list = ['xiaozi', 'aa', 'bb', 'cc']
start_time = time.time()
for i in range(len(name_list)):
get_page(name_list[i])
end_time = time.time()
print("%d second"%(end_time - start_time))
结果为:
3、线程池
# -*-coding = utf-8-*-
# 高性能异步爬虫 - 线程池的使用 示例。
import time
from multiprocessing.dummy import Pool
# 线程池使用
if __name__ == '__main__' :
start_time = time.time()
def get_page(str):
print("正在下载: ", str)
time.sleep(2)
print("下载成功: ", str)
return str
name_list = ['xiaozi', 'aa', 'bb', 'cc']
# 实例化一个线程池对象
pool = Pool(4)
# 将列表中每一个元素传递给get_page进行处理
ret = pool.map(get_page, name_list)
print("map的返回结果:", ret)
end_time = time.time()
print("%d second"%(end_time - start_time))
pool.close()
pool.join()
结果为: