Python使用grequests并发发送请求

Stella981
• 阅读 1173

[TOC]

前言

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]>]
点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Souleigh ✨ Souleigh ✨
3年前
python的requests模块的使用
前言:在web后台开发过程中,会遇到需要向第三方发送http请求的场景,python中的requests库可以很好的满足这一要求,这里简要记录一下requests模块的使用!说明:这里主要记录一下requests模块的如下几点:1.requests模块的安装2.requests模块发送get请求3.requests模块
Stella981 Stella981
3年前
HttpClient使用总结
<divclass"htmledit\_views"<h1<aname"t0"</a一、使用方法</h1<p使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。<br1.创建HttpClient对象。<br2.创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需
Stella981 Stella981
3年前
Android中使用OkHttp的五种请求方式及注意事项
文章目录一、环境说明1、在gradle中引入依赖2、AndroidManifest中开启网络权限3、搭建测试接口4、编写OkHttp工具类二、发送请求1.发送无参的Get请求
Stella981 Stella981
3年前
Python实训第三天
1.requests基本使用importrequests导入requests请求库往百度主页发送请求,获取响应对象responserequests.get(url'https://www.baidu.com/')设置字符编码为utf8response.enco
Stella981 Stella981
3年前
React Native 网络层分析
文:志俊(沪江Web前端)本文原创,转载请注明作者及出处在使用ReactNative开发中,我们熟练的采用JavaScript的方式发送请求的方式发送一个请求到服务端,但是处理这个请求的过程其实和处理Web应用中发送的请求的过程是不一样的。因为处理这个请求的目标不是浏览器,而是嵌入这个应用的原生操作系统。<!more
Stella981 Stella981
3年前
Linux应急响应(二):捕捉短连接
0x00前言​短连接(shortconnnection)是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时,才去建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。在系统维护中,一般很难去察觉,需要借助网络安全设备或者抓包分析,才能够去发现。0x01应急场景​
HTTP请求:requests模块基础使用必知必会 | 京东云技术团队
http请求是常见的一种网页协议,我们看到的各种网页,其实都是发送了http请求得到了服务器的响应,从而将数据库中复杂的数据以简单、直观的方式呈现出来,方便大众阅读、使用。而如何发送http请求呢?今天来探讨一下使用requests模块,达到高效、简单的http请求操作。
Json格式Java封装天猫商品详情数据接口,实现海量商品采集业务
根据天猫的API文档,获取天猫商品详情的API是通过发送Http/Post/GET请求,其中itemID是具体的商品ID。以下是Python和Java封装获取天猫商品详情API(复制Taobaoapi2014)的示例代码:1.请求方式:HTTPPOSTGE
liam liam
11个月前
深入解析:Axios 请求如何取消?
在前端开发中,网络请求是非常常见的操作。而有时候,我们可能需要在发送请求后取消它,比如用户在请求还未完成时离开了当前页面或者执行了其他操作,本文将介绍如何在使用发送请求时取消这些请求。基本概念在Axios中,取消请求的基本思路是创建一个用于取消的标记(ca