前言
此库基于requests二次开发,使用方便快捷。
执行方面,因requests是串行请求的,所以效率方面远不及并发请求的grequests
安装方法: pip install gevent grequests
项目地址:https://github.com/spyoungtech/grequests
grequests的使用
使用场景:
1) 爬虫设置ip代理池时验证ip是否有效
2)进行压测时,进行批量请求等等场景grequests 利用 requests和gevent库,做了一个简单封装,使用起来非常方便。
grequests.map(requests, stream=False, size=None, exception_handler=None, gtimeout=None)
另外,由于grequests底层使用的是requests,因此它支持GET,OPTIONS, HEAD, POST, PUT, DELETE 等各种http method
所以以下的任务请求都是支持的
grequests.post(url, json={“name”:“zhangsan”})
grequests.delete(url)
代码如下:
import grequests
urls = [
'http://www.baidu.com',
'http://www.qq.com',
'http://www.163.com',
'http://www.zhihu.com',
'http://www.toutiao.com',
'http://www.douban.com'
]
rs = (grequests.get(u) for u in urls)
print(grequests.map(rs)) # [<Response [200]>, None, <Response [200]>, None, None, <Response [418]>]
#异常处理
def exception_handler(request, exception):
print("请求出错")
reqs = [
grequests.get('http://httpbin.org/delay/1', timeout=0.001),
grequests.get('http://fakedomain/'),
grequests.get('http://httpbin.org/status/500')
]
print(grequests.map(reqs, exception_handler=exception_handler))
运行结果:
[<Response [200]>, <Response [200]>, <Response [200]>, <Response [403]>, <Response [200]>, <Response [418]>]
请求出错
请求出错
[None, None, <Response [500]>]
[Finished in 2.8s]
另外,在使用该方法时,若想得到返回值的某些值,如单个接口的请求时间,可使用elapsed方法
attrs bool class delattr dict dir doc enter eq exit format ge getattribute getstate gt hash init init_subclass iter le lt module ne new nonzero reduce reduce_ex repr setattr setstate sizeof str subclasshook weakref content content_consumed next apparent_encoding close connection content cookies elapsed encoding headers history is_permanent_redirect is_redirect iter_content iter_lines json links next ok raise_for_status raw reason request status_code text url