今天发现一个grequests库,是将gevent库与requests库结合起来的请求库。可以实现异步访问,我觉得挺方便的,就拿来分享一下。
grequests库重点方法就是下面这两行。
import grequests#请求队列,还未发出请求rs = (grequests.get(u) for u in urls)#批量发出请求,得到响应的列表respsresps = grequests.map(rs)
对异步或者gevent库不太了解的可以看看我之前的这两篇文章。这两篇文章加起来阅读时间十多分钟,图文并茂,很好理解的。
使用gevent实现高效异步请求
gevent:异步理论与实战
今天我就直接上代码和效果图。
import grequestsfrom pyquery import PyQuery as pqwords = [\'good\', \'bad\', \'cool\',\'hot\', \'nice\', \'better\',\'head\', \'up\', \'down\',\'right\', \'left\', \'east\']#构建urlsurls = [\"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)#批量发出请求,得到响应的列表respsresps = grequests.map(rs)for resp in resps:#解析出单词的信息。print(word_info(resp))
从上图可见greqeusts库实现了requests不能实现的异步请求,不过grequests缺点是不能像requests那样高度灵活的构建headers,proxy等参数。如果爬的网站防护很Low的话,我们不需要高灵活的requests,就可以放心的使用gerequests提高效率。