爬虫从入门到精通(13) | 爬虫加速计划-高并发抓取-使用gevent协程
文章目录
- 一、gevent模块简介
- 二、安装和依赖
- 三、gevent协程爬虫示例
一、gevent模块简介
- Python通过yield提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持。
- gevent是第三方库,通过greenlet实现协程,其基本思想是: 当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。
- 总结:gevent:协程解决网络阻塞实例,实现并发
注意:使用gevent,可以获得极高的并发性能,但gevent只能在Unix/Linux下运行,在Windows下不保证正常安装和运行。
二、安装和依赖
依赖于greenlet library
支持python 2.6+ 、3.3+
三、gevent协程爬虫示例
# coding: utf-8 # 在导入其他库和模块前,先把monkey模块导入进来,并运行monkey.patch_all()。这样,才能先给程序打上补丁。from gevent import monkey # 从gevent库里导入了monkey模块,这个模块能将程序转换成可异步的程序monkey.patch_all() # 它的作用其实就像你的电脑有时会弹出“是否要用补丁修补漏洞或更新”一样。它能给程序打上补丁,让程序变成是异步模式,而不是同步模式。它也叫“猴子补丁”。import geventimport requestsimport timedef get_response(url): # 定义一个函数,用来执行解析网址和爬取内容 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'} res = requests.get(url, headers=headers) # 发出请求 print(res.status_code)if __name__ == '__main__': start = time.time() # 开始时间 # 构建100个请求任务 url_list = [] for i in range(100): url = 'https://www.baidu.com/' url_list.append(url) # 使用协程 tasks_list = [] for url in url_list: # 用gevent.spawn()创建任务,此任务可以调用cra(url)函数,参数1函数名,后边为该函数需要的参数,按顺序写 task = gevent.spawn(get_response, url) tasks_list.append(task) # 将任务加入列表 # 调用gevent库里的joinall方法,能启动执行tasks_list所有的任务。 gevent.joinall(tasks_list) end = time.time() # 结束时间 print(end - start)
另外我们可以配合多进程使用