这篇文章将为大家详细讲解有关Python如何使用grequests (gevent +请求)并发发送请求,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
<强>前言
强>
请求是Python发送接口请求非常好用的一个三方库,由K神编写,简单,方便上手快。但是请求发送请求是串行的,即阻塞的。发送完一条请求才能发送另一条请求。
为了提升测试效率,一般我们需要并行发送请求。这里可以使用多线程,或者协程,gevent或者aiohttp,然而使用起来,都相对麻烦。
grequests是K神基于gevent +请求编写的一个并发发送请求的库,使用起来非常简单。
安装方法:pip安装gevent grequests
项目地址:https://github.com/spyoungtech/grequests
<强> grequests简单使用强>
首先构造一个请求列表,使用grequests.map()并行发送,得到一个响应列表。示例如下。
import grequests 时间=req_list [#,才能请求列表 grequests.get才能(& # 39;http://httpbin.org/get?a=1& b=2 & # 39;), grequests.post才能(& # 39;http://httpbin.org/post& # 39;,, data=https://www.yisu.com/zixun/{“a”: 1、“b”: 2}), grequests.put (' http://httpbin.org/post ' json={“a”: 1、“b”: 2}), ] res_list=grequests.map (req_list) #并行发送,等最后一个运行完后返回 print (res_list [0]。text) #打印第一个请求的响应文本
grequests支持,邮报》说,删除等请求支持的HTTP请求方法,使用参数和请求一致,发送请求非常简单。
通过遍历res_list可以得到所有请求的返回结果。
<强> grequests和请求性能对比强>
我们可以对比下请求串行和grequests并行请求100次github.com的时间,示例如下。
使用请求发送请求
import 请求 import 时间 时间=start time.time () 时间=res_list [requests.get (& # 39; https://github.com& # 39;), for 小姐:拷贝范围(100)) print (time.time()实体法)
实际耗时约100年代+
使用grequests发送
import grequests import 时间 时间=start time.time () 时间=req_list [grequests.get (& # 39; https://github.com& # 39;), for 小姐:拷贝范围(100)) 时间=res_list grequests.map (req_list) print (time.time()实体法)
实际耗时约3.58 s
<强>异常处理
强>
在批量发送请求时难免遇到某个请求url无法访问或超时等异常,grequests.map()方法还支持自定义异常处理函数,示例如下。
import grequests def err_handler(请求,,除外): 打印才能(“请求出错“) req_list =, ( grequests.get才能(& # 39;http://httpbin.org/delay/1& # 39;,,超时=0.001),,,#,超时异常 grequests.get才能(& # 39;http://fakedomain/& # 39;),,, #,该域名不存在 grequests.get才能(& # 39;http://httpbin.org/status/500& # 39;),, #,正常返回500的请求 ] 时间=res_list grequests.map(请求,exception_handler=err_handler) 打印(res_list)
运行结果:
请求出的错 请求出错 (没有,没有,,& lt; Response [500]祝辞]