Python使用grequests并发发送请求

目录
  • 前言
  • grequests简单使用
  • grequests和requests性能对比
  • 异常处理

前言#

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

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

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

grequests简单使用#

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

Copy
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发送请求

Copy
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发送

Copy
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()方法还支持自定义异常处理函数,示例如下。

Copy
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)

运行结果:

Copy
请求出错
请求出错
[None, None, <Response [500]>]
(0)

相关推荐

  • Requests库常用方法及参数介绍

    Requests库中定义了七个常用的请求方法,这些方法各自有着不同的作用,在这些请求方法中requests.get()与requests.post()方法最为常用.请求方法如下所示: 常用请求方法 方 ...

  • Python3.5

    应朋友之约,帮他做个爬虫,并且每个网页的数据都分别导入到excel中. 目标网站:http://www.hs-bianma.com/hs_chapter_01.htm 根据我的观察,网页采取的是< ...

  • 【AI白身境】学深度学习你不得不知的爬虫基础

    今天是新专栏<AI白身境>的第七篇,所谓白身,就是什么都不会,还没有进入角色. 对于深度学习,一个好的数据集可以说非常重要的,但是通常情况下我们并没有大量的数据,因此我们有必要掌握一定的爬 ...

  • 如何优雅地处理重复(并发)请求?

    对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单. 重复的场景有可能是 ...

  • DotNetty发送请求的最佳实践

    长链接发送request/response时, 绝大部分包都是小包, 而每个小包都要消耗一个IP包, 成本大约是20-30us, 普通千兆网卡的pps大约是60Wpps, 所以想要提高长链接密集IO的 ...

  • python测试开发django-29.发送html格式邮件

    前言 上一篇已经通过send_mail()函数发送纯文本的邮件,发送成功了,如果我们想发送一个html格式的邮件,如何实现呢? 发送html格式的邮件实际上还是调用send_mail()函数 ,只需多 ...

  • python测试开发django-30.发送附件EmailMessage

    前言 Django的 send_mail() 和 send_mass_mail() 函式事实上是对 EmailMessage 类使用方式 的一个轻度封装.send_mail() 和相关的其他封装函式并 ...

  • postman使用教程12-预处理(pre-request) 发送请求

    前言 可以使用 pm.sendRequest 方法从"pre-request"或"Tests"脚本异步发送请求. 如果您要执行计算或同时发送多个请求,而不必等待 ...

  • 教你用 Python 操控你的上网请求

    今天给大家介绍个有意思的工具,不知道你有没有听说过中间人攻击(Man-in-the-middle attack)简称 MITM,是一种"间接"的入侵攻击,这种攻击模式是通过各种技术 ...

  • axios发送请求,一篇搞定

    axios发送请求,一篇搞定

  • Python串口数据打包发送STM32接收数据解析

    Python串口数据打包发送STM32接收数据解析 尝试使用python中的struct.pack函数打包数据通过串口发送,由STM32接收解析. 1. struct.pack: struct.pac ...

  • 缅甸边境赌场关闭导致数千人失业,相关人员欲向总统发送请求信

    [缅甸中文网讯]缅甸掸邦东部大其力消息,由于大其力市的酒店开设的赌场被关闭,导致7000多名缅甸工人失业.为此,2月9日上午10点,市民与酒店老板在1G18 酒店会议大厅,就向总统发送请求信相关进行了 ...