新一代的网络请求库 Httpx

2023-10-27

点击上方“Python学习开发”,选择“加为星标”

第一时间关注Python技术干货!

简介

HTTPX 是最近 GitHub看的到一个比较火的一个项目,根据官网的描述,总结有如下特点:

  • 和使用 requests 一样方便,requests 有的它都有

  • 加入 HTTP/1.1 和 HTTP/2 的支持。

  • 能够直接向 WSGI 应用程序或 ASGI 应用程序发出请求。

  • 到处都有严格的超时设置

  • 全类型注释

  • 100% 的测试覆盖率

比较不错的一个特点是全类型注解,这让我想起了一个叫 Starlette 的库,它也是全类型注解的,类型注解主要方便IDE的智能提示,Java 等静态类型的语言都有这个功能,Python 是近期新加的。其他的后面再说吧,我们还是看例子吧。

安装

httpx 的安装很简单,像其他的 Python 库一样,直接 pip 就完事了

python3 -m pip install httpx

如果需要对 HTTP/2 支持,我们需要额外安装一个库

python3 -m pip install httpx[http2]

使用示例

import httpx
r = httpx.get('https://www.example.org/')
r.text
r.content
r.json()
r.status_code

基本的用法直接导包然后 get 就行了。其他的和 requests 的使用类似

r = httpx.put('https://httpbin.org/put', data={'key': 'value'})
r = httpx.delete('https://httpbin.org/delete')
r = httpx.head('https://httpbin.org/get')
r = httpx.options('https://httpbin.org/get')

Ok,这是基本用法。

如果需要做一个爬虫项目,里面涉及到 Cookie 的传递这时候再这样就不行了,
httpx 有个 requests 的 Session 类型的使用方法.

import httpx
client = httpx.Client() #类似requests.Session()
try:
    do somting
finally:
    client.close() #关闭连接池

更优雅的方法就是使用 with 上下文管理器的形式

with httpx.Client() as client:
    headers = {'X-Custom': 'value'}
    r = client.get('https://example.com', headers=headers)

这里有个地方需要强调下 Client 和 get 里面都可以添加 headers,
最后这两个地方的 headers 可以合并到请求里,官方的例子

>>> headers = {'X-Auth': 'from-client'}
>>> params = {'client_id': 'client1'}
>>> with httpx.Client(headers=headers, params=params) as client:
...     headers = {'X-Custom': 'from-request'}
...     params = {'request_id': 'request1'}
...     r = client.get('https://example.com', headers=headers, params=params)
...
>>> r.request.url
URL('https://example.com?client_id=client1&request_id=request1')
>>> r.request.headers['X-Auth']
'from-client'
>>> r.request.headers['X-Custom']
'from-request'

接下来说下大家比较关心的一点代理的使用,需要注意的是 httpx 的代理只能在 httpx.Client 创建 Client 的实例的时候使用,client.get 的时候没这个参数。
有意思的是它这个代理可以指定规则,限制哪些请求使用代理哪些不使用,来个官方的例子

允许所有请求都走代理
proxies = {
    "all://": "http://localhost:8030",
}

如果字典的值为 None 则表示不使用代理。

不同的协议走不用的代理
proxies = {
    "http://": "http://localhost:8030",
    "https://": "http://localhost:8031",
}

http 走 8030 的代理,https 走 8031 的代理,这里要注意和用 requests 使用代理的区别 requests 是下面这样用的

proxies = {
    "http": "http://localhost:8030",
    "https": "http://localhost:8030",
}
综合使用

你还可以配置多个规则像下面这

proxies = {
    # Route all traffic through a proxy by default...
    "all://": "http://localhost:8030",
    # But don't use proxies for HTTPS requests to "domain.io"...
    "https://domain.io": None,
    # And use another proxy for requests to "example.com" and its subdomains...
    "all://*example.com": "http://localhost:8031",
    # And yet another proxy if HTTP is used,
    # and the "internal" subdomain on port 5550 is requested...
    "http://internal.example.com:5550": "http://localhost:8032",
}

代理就这些,下面看看它的链接池的问题
你可以使用 Client 的关键字参数 limits 来控制连接池的大小。它需要以下实例httpx.Limits 来定义:

  • max_keepalive,允许的保持活动连接数或 None 始终允许。(预设10)

  • max_connections,允许的最大连接数或 None 无限制。(默认为100)

limits = httpx.Limits(max_keepalive_connections=5, max_connections=10)
client = httpx.Client(limits=limits)

如果默认链接数不够用的就自己重新设置吧。(我感觉是不够

我这边只关注了爬虫可能用到的部分,其他的大家可以看看官网。比如怎么搭配flask使用等。

好了关于httpx的同步请求的内容大概就这些要提的。如果只讲到这里,你肯定会说,"就这,用 requests 不香么?",emmm,如果这么想你就错了,要知道它不仅支持同步还支持异步的,使用起来比 aiohttp 简单多了,这才是我推荐的目的。

httpx 之异步请求

要知道官网可是单独把它拎出一节讲的,可以看出里面应该有点东西。
废话少说,开整。

我们先看在 aiohttp 中是如何创建并发送请求的

import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as client:
         async with client.get('http://httpbin.org/get') as resp:
              assert resp.status == 200
              html= await resp.text()
              print(html)

我们需要使用两个 async with 来完成一个请求,然后我们看看 httpx 怎么实现的呢

async with httpx.AsyncClient() as client:
    resp = await client.get('http://httpbin.org/get')
    assert resp.status_code == 200
    html = resp.text

感觉总体上比较 aiohttp 写起来舒服多了,少写很多异步代码。
之前使用 aiohttp 中的 resp.status 来获取状态码的时候写了status_code,应该是使用 requests 习惯了吧,这下好了使用 httpx 不用担心这个写错的问题了。

后记

最近,我刚把我之前的那个 discogs_aio_spider 的项目给改了,之前用的aiohttp,我现在改成 httpx,对 httpx 感兴趣的朋友,可以到上面研究下我这个项目,有问题欢迎提出。????
项目名:discogs_aio_spider
项目地址:https://github.com/cxapython/discogs_aio_spider
使用到的模块:asyncio、httpx、motor、aio-pika、aioredis

推荐阅读

asyncio之异步上下文管理器

异步爬虫模块aiohttp实战之infoq

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新一代的网络请求库 Httpx 的相关文章

随机推荐

  • 初级Java程序员如何快速提升自己的能力?

    对于刚刚进入工作岗位的初级程序员来说 不论是进入外包公司 还是互联网公司 都需要一个适应的过程 不少刚走上工作岗位的程序员 就是因为迟迟不能进入工作状态而选择离开 这也是比较常见的事情 导致不能进入工作状态的原因主要有三方面 其一是自身的知
  • python小游戏毕设 走迷宫小游戏设计与实现 (源码)

    文章目录 0 项目简介 1 课题背景 2 实现效果 3 Pygame介绍 4 具体实现 4 1 创建迷宫 4 2 定义角色类 4 3 界面切换 5 最后 0 项目简介 Hi 各位同学好呀 这里是L学长 今天向大家分享一个今年 2022 最新
  • 背景的设置、渐变和雪碧图

    一 背景的设置和和可选值 1 background color 设置背景颜色 2 background image来设置背景图片 语法 background image url 相对路径 可以同时为一个元素指定背景颜色和背景图片 这样背景颜
  • springboot学习笔记(一)

    基础知识点 什么是Spring Spring是一个开源框架 2003年兴起的一个轻量级的java开发框架 Spring是为了解决企业级应用开发的复杂性而创建的 简化开发 Spring是如何简化java开发的 什么是springboot sp
  • Keras模型测试准确率震荡大

    今天在Keras训练了一个模型 发现模型的训练accuracy和测试accuracy的准确率偏差比较大 如下 在问了些大佬后 感谢大佬 我的这个原因很可能是因为过拟合导致的差距比较大 之后在每个层之间都加入了dropout 再重新训练模型得
  • Unity中欧拉角

    什么是欧拉角 没有方向 大小概念 1 使用单个角度来保存方位 2 X与Z沿自身坐标系旋转 Y沿世界坐标旋转 3 API Vector3 eulerAngle this tranform rulerAngles 优点 1 仅使用三个数字表达方
  • 如何备份服务器系统还原,服务器操作系统备份和还原

    服务器操作系统备份和还原 内容精选 换一换 实例支持自动化发放裸金属服务器 远程Console登录 支持租户自主管理裸金属服务器生命周期 查询 启动 关机 重启 删除 导出服务器列表 将租户名下的所有裸金属服务器信息 以CSV文件的形式导出
  • signature=8f638f82cfb5ef3c26e5bb05751ee69d,iSpy/VideoSourceAdvanced.resx at 4eee092db75fe362bcfb7752...

    text microsoft resx 2 0 System Resources ResXResourceReader System Windows Forms Version 4 0 0 0 Culture neutral PublicK
  • STM32微控制器综合实训11 伺服电机控制器设计实验

    实验11 伺服电机控制器设计实验 了解伺服电机的应用领域 掌握伺服电机的速度控制模式 伺服电机的位置控制模式 文章目录 程序设计 伺服电机的速度控制模式代码讲解 main c timer c 伺服电机的位置控制模式代码讲解 main c t
  • 8 Buildroot 根文件系统构建

    一 根文件系统简介 根文件系统一般也叫做 rootfs 这个是属于 Linux 内核的一部分 根文件系统首先是一种文件系统 该文件系统不仅具有普通文件系统的存储数据文件的功能 但是相对于普通的文件系统 它的特殊之处在于 它是内核启动时所挂载
  • oracle函数忽略大小写,Oracle中不区分大小写的主键

    我们的数据的语义不区分大小写 因此我们将oracle会话配置为不区分大小写 alter session set NLS COMP LINGUISTIC alter session set NLS SORT BINARY AI 然后 为了利用
  • vue3中的reactive和ref

    一 关于reactive reactive 接受一个对象类型的值 返回一个对象的代理 reactive的特点 1 仅对对象类型有效 对象 数组和 Map Set 这样的集合类型 而对 string number 和 boolean 这样的
  • 自己动手写一个key value store

    一涉及到persistent 哪怕只是最基本的需求 很多人都会依赖数据库 或是其他现成的库或工具 确实 对于文件 大部分人很少直接打交道 或者只是诸如整体反序列化 序列化 按行读取 append new line等有限的操作 一个persi
  • JAVA 文件的基本操作

    获取指定目录下的所有文件的名字 param path 目标目录路径 public static ArrayList
  • 光谱成像技术用于河北鸭梨的物理损伤检测

    目录 前言 相关工作 相关工作一 相关工作二 本文实验 样本 实验设备 数据处理 面检测方法一 面检测方法二 结论 参考文献 前言 高光谱成像技术可以对大范围的农产品进行识别和检测 已经在工业界得到应用 取代了效率低 精度低 费时费力的人工
  • WebView的一些问题分析

    1 性能问题 打开速度比原生慢 对于一个普通用户来讲 打开一个WebView通常会经理一下几个阶段 发出请求 gt 到达新的页面 页面白屏 gt 页面基本框架出现 但是没有数据 gt 页面处于loading状态 gt 出现数据 如果从程序上
  • ElasticSearch6.x +logstash6.x +MySQL8 MySQL8 数据同步,字母大小写问题

    ElasticSearch6 x logstash6 x同步MySQL8数据的时候 sql里面含有的大写字母 到了ElasticSearch6 x的时候就会变成小写 这是因为在jdbc conf里面没有添加 lowercase column
  • 黑客是这样的炼成的

    黑客的态度 黑客们解决问题 建设事物 信仰自由和双向的帮助 人人为我 我为人人 要想被认为是一名黑客 你的行为必须显示出你已经具备了这种态度 要想做的好象你具备这种态度 你就不得不真的具备这种态度 但是如果你想靠培养黑客态度在黑客文化中得到
  • Qt安卓工程报错:No rule to make target

    Qt编译工程报错 No rule to make target 网上查到的解决方案是这样的 第一种情况 Qt编译工程时候 所有用到的源文件包括头文件和库文件的 总路径长度不能超过190个左右字符 一旦超过 就会提示找不到那个文件 这个可能是
  • 新一代的网络请求库 Httpx

    点击上方 Python学习开发 选择 加为星标 第一时间关注Python技术干货 简介 HTTPX 是最近 GitHub看的到一个比较火的一个项目 根据官网的描述 总结有如下特点 和使用 requests 一样方便 requests 有的它