> 文档中心 > 爬虫从入门到精通(13) | 爬虫加速计划-高并发抓取-使用gevent协程

爬虫从入门到精通(13) | 爬虫加速计划-高并发抓取-使用gevent协程

在这里插入图片描述

文章目录

  • 一、gevent模块简介
  • 二、安装和依赖
  • 三、gevent协程爬虫示例

爬虫从入门到精通(13) | 爬虫加速计划-高并发抓取-使用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)

另外我们可以配合多进程使用