Python使用grequests并发发送请求的示例


Posted in Python onNovember 05, 2020

前言

requests是Python发送接口请求非常好用的一个三方库,由K神编写,简单,方便上手快。但是requests发送请求是串行的,即阻塞的。发送完一条请求才能发送另一条请求。
为了提升测试效率,一般我们需要并行发送请求。这里可以使用多线程,或者协程,gevent或者aiohttp,然而使用起来,都相对麻烦。

grequests是K神基于gevent+requests编写的一个并发发送请求的库,使用起来非常简单。

安装方法: pip install gevent grequests
项目地址:https://github.com/spyoungtech/grequests

grequests简单使用

首先构造一个请求列表,使用grequests.map()并行发送,得到一个响应列表。示例如下。

import grequests

req_list = [ # 请求列表
 grequests.get('http://httpbin.org/get?a=1&b=2'),
 grequests.post('http://httpbin.org/post', data={'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支持get、post、put、delete等requests支持的HTTP请求方法,使用参数和requests一致,发送请求非常简单。
通过遍历res_list可以得到所有请求的返回结果。

grequests和requests性能对比

我们可以对比下requests串行和grequests并行请求100次github.com的时间,示例如下。
使用requests发送请求

import requests
import time

start = time.time()
res_list = [requests.get('https://github.com') for i in range(100)]
print(time.time()-start)

实际耗时约100s+

使用grequests发送

import grequests
import time

start = time.time()
req_list = [grequests.get('https://github.com') for i in range(100)]
res_list = grequests.map(req_list)
print(time.time()-start)

际耗时约3.58s

异常处理

在批量发送请求时难免遇到某个请求url无法访问或超时等异常,grequests.map()方法还支持自定义异常处理函数,示例如下。

import grequests

def err_handler(request, exception):
 print("请求出错")

req_list = [
 grequests.get('http://httpbin.org/delay/1', timeout=0.001), # 超时异常
 grequests.get('http://fakedomain/'), # 该域名不存在
 grequests.get('http://httpbin.org/status/500') # 正常返回500的请求
]

res_list = grequests.map(reqs, exception_handler=err_handler)
print(res_list)

运行结果:

请求出错
请求出错
[None, None, <Response [500]>]

以上就是Python使用grequests并发发送请求的示例的详细内容,更多关于Python grequests发送请求的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 Python
Python使用三种方法实现PCA算法
Dec 12 Python
深入理解Django的中间件middleware
Mar 14 Python
python函数式编程学习之yield表达式形式详解
Mar 25 Python
python之消除前缀重命名的方法
Oct 21 Python
python3 property装饰器实现原理与用法示例
May 15 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
PYQT5设置textEdit自动滚屏的方法
Jun 14 Python
用scikit-learn和pandas学习线性回归的方法
Jun 21 Python
Pycharm最新激活码2019(推荐)
Dec 31 Python
python 命名规范知识点汇总
Feb 14 Python
pandas 实现将NaN转换为None
May 14 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 #Python
Python中常用的os操作汇总
Nov 05 #Python
Python Web项目Cherrypy使用方法镜像
Nov 05 #Python
Python实现异步IO的示例
Nov 05 #Python
Python requests HTTP验证登录实现流程
Nov 05 #Python
Python包资源下载路径报404解决方案
Nov 05 #Python
如何一键升级Python所有包
Nov 05 #Python
You might like
PHP4实际应用经验篇(7)
2006/10/09 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
php操作access数据库的方法详解
2017/02/22 PHP
utf8的编码算法 转载
2006/12/27 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
javascript中eval函数用法分析
2015/04/25 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
javascript事件处理模型实例说明
2016/05/31 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
javascript将list转换成树状结构的实例
2017/09/08 Javascript
jquery.picsign图片标注组件实例详解
2018/02/02 jQuery
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
vue 解决遍历对象显示的顺序不对问题
2019/11/07 Javascript
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
pandas带有重复索引操作方法
2018/06/08 Python
django2用iframe标签完成网页内嵌播放b站视频功能
2018/06/20 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
Python函数生成器原理及使用详解
2020/03/12 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
在python中修改.properties文件的操作
2020/04/08 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
html5需遵循的6个设计原则
2016/04/27 HTML / CSS
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
副总经理工作职责
2013/11/28 职场文书
军训的自我鉴定
2013/12/10 职场文书
大学自我鉴定范文
2013/12/26 职场文书
即兴演讲稿
2014/01/04 职场文书
工程招投标邀请书
2014/01/30 职场文书
搞笑的婚礼主持词
2015/06/29 职场文书
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB