线程池的使用
学到现在,我们可以说已经学习了爬虫的基础知识,如果没有那些奇奇怪怪的反爬虫机制,基本上只要有时间分析,一般的数据都是可以爬取的,那么到了这个时候我们需要考虑的就是爬取的效率了,关于提高爬虫效率,也就是实现异步爬虫,我们可以考虑以下两种方式:一是线程池的使用(也就是实现单进程下的多线程),一是协程的使用(如果没有记错,我所使用的协程模块是从python3.4以后引入的,我写博客时使用的python版本是3.9)。
今天我们先来讲讲线程池。
同步代码演示
我们先用普通的同步的形式写一段代码
import time
def func(url):
print("正在下载:", url)
time.sleep(2)
print("下载完成:", url)
if __name__ == '__main__':
start = time.time() # 开始时间
url_list = [
"a", "b", "c"
]
for url in url_list:
func(url)
end = time.time() # 结束时间
print(end - start)
对于代码运行的结果我们心里都有数,但还是让我们来看一下吧
不出所料。运行时间果然是六秒
异步,线程池代码
那么如果我们使用线程池运行上述代码又会怎样呢?
import time
from multiprocessing import Pool
def func(url):
print("正在下载:", url)
time.sleep(2)
print("下载完成:", url)
if __name__ == '__main__':
start = time.time() # 开始时间
url_list = [
"a", "b", "c"
]
pool = Pool(len(url_list)) # 实例化一个线程池对象,并且设定线程池的上限数量为列表长度。不设置上限也可以。
pool.map(func, url_list)
end