Python grequests模块使用场景及代码实例


Posted in Python onAugust 10, 2020

使用场景:

1) 爬虫设置ip代理池时验证ip是否有效

2)进行压测时,进行批量请求等等场景

grequests 利用 requests和gevent库,做了一个简单封装,使用起来非常方便。

grequests.map(requests, stream=False, size=None, exception_handler=None, gtimeout=None)

Python grequests模块使用场景及代码实例

另外,由于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("Request failed")
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))

实际操作中,也可以自定义返回的结果

修改grequests源码文件:

例如:

新增extract_item() 函数合修改map()函数

def extract_item(request):
  """
  提取request的内容
  :param request:
  :return:
  """
  item = dict()
  item["url"] = request.url
  item["text"] = request.response.text or ""
  item["status_code"] = request.response.status_code or 0
  return item

def map(requests, stream=False, size=None, exception_handler=None, gtimeout=None):
  """Concurrently converts a list of Requests to Responses.

  :param requests: a collection of Request objects.
  :param stream: If True, the content will not be downloaded immediately.
  :param size: Specifies the number of requests to make at a time. If None, no throttling occurs.
  :param exception_handler: Callback function, called when exception occured. Params: Request, Exception
  :param gtimeout: Gevent joinall timeout in seconds. (Note: unrelated to requests timeout)
  """
  requests = list(requests)
  pool = Pool(size) if size else None
  jobs = [send(r, pool, stream=stream) for r in requests]
  gevent.joinall(jobs, timeout=gtimeout)
  ret = []
  for request in requests:

    if request.response is not None:
      ret.append(extract_item(request))
    elif exception_handler and hasattr(request, 'exception'):
      ret.append(exception_handler(request, request.exception))
    else:
      ret.append(None)

  yield ret

可以直接调用:

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)
response_list = grequests.map(rs, gtimeout=10)
for response in next(response_list):
  print(response)

支持事件钩子

def print_url(r, *args, **kwargs):
print(r.url)

url = “http://www.baidu.com”
res = requests.get(url, hooks={“response”: print_url})
tasks = []
req = grequests.get(url, callback=print_url)
tasks.append(req)
ress = grequests.map(tasks)
print(ress)

Python grequests模块使用场景及代码实例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之大话题小函数(2)
Oct 10 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
Apr 18 Python
python输出当前目录下index.html文件路径的方法
Apr 28 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
Windows下Python3.6安装第三方模块的方法
Nov 22 Python
Django错误:TypeError at / 'bool' object is not callable解决
Aug 16 Python
python-xpath获取html文档的部分内容
Mar 06 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
python调用百度API实现人脸识别
Nov 17 Python
python多线程爬取西刺代理的示例代码
Jan 30 Python
django中websocket的具体使用
Jan 22 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 #Python
Python Celery异步任务队列使用方法解析
Aug 10 #Python
使用Python将语音转换为文本的方法
Aug 10 #Python
Python获取excel内容及相关操作代码实例
Aug 10 #Python
Python利用命名空间解析XML文档
Aug 10 #Python
Python如何定义有默认参数的函数
Aug 10 #Python
如何更换python默认编辑器的背景色
Aug 10 #Python
You might like
用PHP调用数据库的存贮过程
2006/10/09 PHP
php标签云的实现代码
2012/10/10 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
用php简单实现加减乘除计算器
2014/01/06 PHP
PHP入门教程之面向对象基本概念实例分析
2016/09/11 PHP
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
2017/04/24 jQuery
浅谈angular4生命周期钩子
2017/09/05 Javascript
javascript input输入框模糊提示功能的实现
2017/09/25 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
Python实现数据库编程方法详解
2015/06/09 Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
2016/07/02 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
python文件读写代码实例
2019/10/21 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
计算机专业推荐信范文
2013/11/27 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
收入证明范本
2015/06/12 职场文书
先进个人事迹材料(2016推荐版)
2016/03/01 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js