今天发现一个grequests库,是将gevent库与requests库结合起来的请求库。可以实现异步访问,我觉得挺方便的,就拿来分享一下。
grequests库重点方法就是下面这两行。
import grequests
#请求队列,还未发出请求
rs = (grequests.get(u) for u in urls)
#批量发出请求,得到响应的列表resps
resps = grequests.map(rs)
对异步或者gevent库不太了解的可以看看我之前的这两篇文章。这两篇文章加起来阅读时间十多分钟,图文并茂,很好理解的。
使用gevent实现高效异步请求
gevent:异步理论与实战
今天我就直接上代码和效果图。
import grequests
from pyquery import PyQuery as pq
words = ['good', 'bad', 'cool',
'hot', 'nice', 'better',
'head', 'up', 'down',
'right', 'left', 'east']
#构建urls
urls = ["http://dict.youdao.com/w/eng/{}/".format(w) for w in words]
def word_info(resp):
"""
解析出单词信息
resp 为requests对网址请求后得到的响应
返回字典信息
"""
doc = pq(resp.text)
pros = ''
for pro in doc.items('.baav .pronounce'):
pros += pro.text()
description = ''
for li in doc.items('#phrsListTab .trans-container ul li'):
description += li.text()
return {'音标': pros, '注释': description}
#请求队列,还未发出请求
rs = (grequests.get(u) for u in urls)
#批量发出请求,得到响应的列表resps
resps = grequests.map(rs)
for resp in resps:
#解析出单词的信息。
print(word_info(resp))
从上图可见greqeusts库实现了requests不能实现的异步请求,不过grequests缺点是不能像requests那样高度灵活的构建headers,proxy等参数。如果爬的网站防护很Low的话,我们不需要高灵活的requests,就可以放心的使用gerequests提高效率。