其他
使用gevent实现高效异步请求
《python异步爬虫详解》一文代码太过繁琐,谢谢
学习学习再学习”(博客园:Alex的盗版学生)
提到的使用猴子补丁的意见。今天重写一下。
一、同步与异步
异步编程可以大幅度的提高系统的吞吐量,提高单位时间内发出的请求数目。之前大邓写的爬虫都是同步,就是对aurl发起请求,等待响应。然后再访问burl,等待响应。。。
大量的时间消耗在等待上,如果能近似的同时对多个网址发起请求,等待响应,速度回快很多倍。这里的同时其实是为了让大家便于理解,其实所谓的同时也是有先后顺序的,所以叫异步。
文字描述太别扭,我们水平方向代表时间
#同步编程(同一时间只能做一件事,做完了才能做下一件事情)<-a_url-><-b_url-><-c_url->#异步编程 (可以近似的理解成同一时间有多个事情在做,但有先后)<-a_url->
<-b_url->
<-c_url->
<-d_url->
<-e_url->
<-f_url->
<-g_url->
<-h_url->
<--i_url-->
<--j_url-->
你看同步编程同样的时间访问了3个网址,但是异步编程访问的效率提高了很多倍。
二、功能实现
2.1gevent简介
gevent是一个python的并发库,它为各种并发和网络相关的任务提供了整洁的API。
gevent中用到的主要模式是greenlet,它是以C扩展模块形式接入Python的轻量级协程。 greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
2.2 猴子补丁
昨天的分享的文章中也发现了requests库是阻塞式的,也就无法像上面图形那种,将requests同步更改为异步。只有将requests库阻塞式更改为非阻塞,异步操作才能实现。
而gevent库中的猴子补丁(monkey patch),gevent能够修改标准库里面大部分的阻塞式系统调用。这样在不改变原有代码的情况下,将应用的阻塞式方法,变成协程式的(异步)。
三、代码
from gevent import monkey
import gevent
import requests
import time
monkey.patch_all()
def req(url):
print(url)
resp = requests.get(url)
print(resp.status_code,url)
def synchronous_times(urls):
"""同步请求运行时间"""
start = time.time()
for url in urls:
req(url)
end = time.time()
print('同步执行时间 {} s'.format(end-start))
def asynchronous_times(urls):
"""异步请求运行时间"""
start = time.time()
gevent.joinall([gevent.spawn(req,url) for url in urls])
end = time.time()
print('异步执行时间 {} s'.format(end - start))
urls = ['https://book.douban.com/tag/小说','https://book.douban.com/tag/科幻',
'https://book.douban.com/tag/漫画','https://book.douban.com/tag/奇幻',
'https://book.douban.com/tag/历史','https://book.douban.com/tag/经济学']
synchronous_times(urls)
asynchronous_times(urls)
https://book.douban.com/tag/小说
200 https://book.douban.com/tag/小说
https://book.douban.com/tag/科幻
200 https://book.douban.com/tag/科幻
https://book.douban.com/tag/漫画
200 https://book.douban.com/tag/漫画
https://book.douban.com/tag/奇幻
200 https://book.douban.com/tag/奇幻
https://book.douban.com/tag/历史
200 https://book.douban.com/tag/历史
https://book.douban.com/tag/经济学
200 https://book.douban.com/tag/经济学
同步执行时间 6.054782867431641 s
https://book.douban.com/tag/小说
https://book.douban.com/tag/科幻
https://book.douban.com/tag/漫画
https://book.douban.com/tag/奇幻
https://book.douban.com/tag/历史
https://book.douban.com/tag/经济学
200 https://book.douban.com/tag/历史
200 https://book.douban.com/tag/漫画
200 https://book.douban.com/tag/小说
200 https://book.douban.com/tag/经济学
200 https://book.douban.com/tag/奇幻
200 https://book.douban.com/tag/科幻
异步执行时间 1.114253044128418 s
异步请求效率是同步请求近5倍!!!再次感谢
微信昵称:"学习学习再学习”(博客园:Alex的盗版学生)
教程及代码下载
链接: https://pan.baidu.com/s/1miwyB5u 密码: 4ffj
觉得有收获可以送支鹅毛信哦~(^_^)
历史文章:
数据采集
【视频】有了selenium,小白也可以自豪的说:“去TMD的抓包、cookie”
【视频】快来get新技能--抓包+cookie,爬微博不再是梦