httpx 与 异步

article/2025/9/17 14:03:03

前言

        HTTPX 是新一代的 python 解析库,它是一个功能齐全的 HTTP 客户端,用于Python 3,较requests(只能发送同步请求)和 aiohttp(只能发送异步请求)不同的是,它同时提供同步和异步 API,有些网站强制使用 HTTP / 2.0 协议访问,urllib 和 requests 是无法爬取数据的,它们只支持 HTTP / 1.1,而 HTTPX 则全部支持。

        例如 HTTPX 官网(F12 打开开发人员工具界面 → 选择网络【Network】 → 右键点击名称选中协议【Protocol】即可查看网站支持的协议类型,h2 即为 HTTP / 2.0 协议):

官方文档:https://www.python-httpx.org/

Github:https://github.com/encode/httpx/

HTTPX 的特点

  • 广泛兼容请求的 API
  • 标准同步接口,可提供异步支持
  • HTTP/1.1 和 HTTP / 2.0 支持
  • 能够直接向 WSGI 应用程序或 ASGI 应用程序发出请求。
  • 无处不在的严格超时
  • 完全键入批注
  • 100% 测试覆盖率
  • 国际域和网址
  • Keep-Alive & Connection Pooling
  • 具有 Cookie 持久性的会话
  • 浏览器样式的 SSL 验证
  • 基本/摘要式身份验证
  • 优雅的键/值 Cookie
  • 自动减压
  • 自动内容解码
  • 统一码响应正文
  • 分段文件上传
  • 代理支持
  • 连接超时
  • 流媒体下载
  • .netrc 支持
  • 分块请求

HTTPX 的安装

HTTPX 所需版本为 Python 3.6 及以上,可通过以下命令安装:

pip3 install httpx

但是如果想让 HTTPX 支持 HTTP / 2.0 的话,用如下命令安装:

pip3 install httpx[http2]

以下即为成功:

HTTPX 之 Client 对象

        在了解 httpx 如何使用前,先了解一下 httpx 的 Client 对象,httpx.Client() 相当于 requests.Session 的替代,相较于 httpx 的其他 API 方法,Client 能更有效地利用网络资源,Client 使用 http 连接池,这意味着,当向同一主机发出多个请求时,将重用底层 TCP 连接,而不是为每个请求重新创建一个新的连接,能显著的改善性能:

  • 减少了跨请求的延迟(无需握手)
  • 减少 CPU 使用率和往返次数
  • 减少网络拥塞

Client 的基本使用

方法一:作为上下文管理器,较推荐方式

import httpx
with httpx.Client() as client:response = client.get('https://httpbin.org/get')print(response)
# <Response [200 OK]>

方法二:显示关闭连接池 

import httpx
client = httpx.Client()
try:response = client.get('https://httpbin.org/get')print(response)
finally:client.close()
# <Response [200 OK]>

发送自定义请求头信息:

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

Client 可以通过将参数传递给构造函数来将配置应用于所有传出请求 :

import httpx
url = 'http://httpbin.org/headers'
headers = {'user-agent': 'my-app/0.0.1'}
with httpx.Client(headers=headers) as client:r = client.get(url)print(r.json()['headers']['User-Agent'])
# my-app/0.0.1

更多详细用法可参考 Client 官方文档:https://www.python-httpx.org/advanced/

HTTPX 的使用

发送同步请求 

httpx 和 requests 的基本使用有很多相似之处,例如进行 GET 请求:

import httpx
response = httpx.get('https://httpbin.org/get')
print(response.status_code)
print(response.headers)
print(response.text)
print(response.url)
print(response.cookies)
print(response.history)
  • status_code:状态码
  • headers:响应头
  • text:响应体
  • url:网页链接 URL
  • cookies:获取 Cookie 信息
  • history:请求历史

如图所示:"User-Agent": "python-httpx/0.22.0" ,即为使用 httpx 发送请求:

如下直接使用 httpx 访问 HTTP/2.0 的网站会出现报错:

import httpx
url = 'https://spa16.scrape.center/'
response = httpx.get(url)
print(response.text)

报错信息:httpcore.ReadError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 

原因: httpx 默认不开启对 HTTP/2.0 的支持,默认使用的是 HTTP/1.0 需要手动声明一下才能使用 HTTP/2.0 ,这里就要使用到上述所讲的 httpx 的 Client 对象:

import httpx
# 显示将 http2 设置为 True,开启对 HTTP/2.0 的支持
client = httpx.Client(http2=True)
url = 'https://spa16.scrape.center/'
response = client.get(url)
print(response.text)
print(response.http_version)
# HTTP/2
# 代表使用了 HTTP/2.0 协议传输

注意:在客户端的 httpx 上启用对 HTTP/2.0 的支持并不意味着请求和响应都将通过 HTTP/2.0 传输,这得客户端和服务端都支持 HTTP/2.0 才行,如果客户端连接到仅支持 HTTP/1.0 的服务器,那么它也需要改用 HTTP/1.0 。

发送异步请求

        httpx 支持异步客户端请求,支持 Pyhton 的 async 请求模式,异步是一种并发模型,比多线程高效得多,可以提供显著的性能优势,并允许使用长期网络连接,如果使用的是异步 Web 框架,则还需要使用异步客户端发送传出 HTTP 请求,若要发送异步请求,需要使用到 httpx.AsyncClient() 方法:

官方文档给出的方式是:

import httpxasync with httpx.AsyncClient() as client:r = await client.get('https://www.example.com/')
print(r.code)

但需要注意的是 async with xxx as xxx 这个结构需要放在 async def xxx( ) 函数内:

不然会报错:SyntaxError: 'async with' outside async function,显示语法错误

import httpx
import asyncioasync def main():async with httpx.AsyncClient() as client:response = await client.get('https://www.example.com/')print(response.http_version)# HTTP/1.1asyncio.run(main())

使用 HTTP/2.0 即更改为 httpx.AsyncClient(http2=True)

更多详细用法可参考 Client 官方文档:异步支持 - HTTPX (python-httpx.org)

异步

        为了完成某个任务,有时不同程序单元之间无需通信协调也能完成任务,此时不相关的程序单元之间可以是异步的,如爬取网页,调度程序调用下载程序后,即可调度其他任务,无需与该下载任务保持通信以协调行为,不同网页的下载、保存等操作都是无关的,也无须相互通知协调,这些异步操作完成的时刻不确定,所以异步也意味着无序执行。 

总结 

        以上为对新一代功能强大的解析库 HTTPX 的相关知识的基本归纳总结,同时引出了相关的异步概念,后续会对异步爬虫进行具体项目分析,有任何建议欢迎评论区指正交流~


http://chatgpt.dhexx.cn/article/nJymRBW0.shtml

相关文章

一文了解异步编程基础

什么是异步编程&#xff1f; 异步编程是指并发编程的范式&#xff0c;其中除了单个主应用程序线程之外&#xff0c;工作可以委托给一个或多个并行工作线程。这被称为非阻塞系统&#xff0c;其中整体系统速度不受订单执行的影响&#xff0c;并且多个进程可以同时发生。 函数从 …

异步函数async

什么是同步异步 在最新的ES7&#xff08;ES2017&#xff09;中提出的前端异步特性&#xff1a;async、await。 在了解async和await之前得先明白什么是同步函数&#xff0c;什么是异步函数。 同步函数&#xff1a;当一个函数是同步执行时&#xff0c;那么当该函数被调用时不会…

异步(async、await)

同步与异步 同步&#xff1a;如果一个程序调用某个方法&#xff0c;等待其执行所有处理后才继续执行&#xff0c;我们就称这样的方法是同步的&#xff0c;这是默认的形式异步&#xff1a;异步的方法在处理完成之前就返回到调用方法&#xff0c;C#的async/await特性可以创建并使…

async/awiat和promise之间的区别

今天看到了一段代码 async function async1() {console.log(async1 start);await async2();console.log(async1 end); } async function async2() {console.log(async2); } console.log(script start); setTimeout(function() {console.log(setTimeout); }, 0) async1(); new …

什么是异步

文章目录 前言一、异步是什么&#xff1f;二、举个例子来理解异步 1.异步最典型的例子就是“回调函数”总结 前言 在vue的过程中&#xff0c;我们一定会遇到诸如&#xff1a; function&#xff08;参数&#xff09;.then(res>{}) 形式的代码。到底怎么编译执行的呢 &#x…

Spring Boot 基础学习之(五)页面通过自定义LocaleResolver组件实现网页页面的的中英文转换

本次项目所有能够使用的静态资源可以免费进行下载 静态资源 在前端网页&#xff0c;是不是看见过这样的功能 基础网页&#xff1a;中文表示 点击下面的English 按钮网页显示文字开始切换 通过功能性按钮实现中英文切换&#xff0c;在浏览器中&#xff0c;都带着一个功能叫翻…

网页中文转英文(国际化)

背景&#xff1a; 我的项目是已经完成的项目&#xff0c;因为要拓展海外市场&#xff0c;需要支持英文。 采用的方式是添加配置文件&#xff0c;见下文详细步骤。 本文基本转自&#xff1a;http://blog.csdn.net/wuhawang/article/details/52228589 在他的基础上给大家一点提示…

英语数字转换器

英语数字转换器 STL中map&#xff0c;stack和string的运用 描述&#xff1a; 在这个问题中&#xff0c;将用英语给你一个或多个整数。你的任务是将这些数字转换成整型表示。数字范围从-999,999,999到999,999,999.下面是你的程序必须考虑的详尽的英语单词表&#xff1a; neg…

Unity 中英文转换

在Resources下创建文件夹LanguageTxt&#xff0c;再其创建“Chinese.txt”及“English.txt”&#xff08;记得保存文本时选择UTF-8&#xff09; Chinese.txt Btn:这是一个按钮 English.txt Btn:This is a button 在Scripts下创建“LanguageManager.cs”及“UIText.cs” L…

SAP中英文转换--中文转英文

中文转英文-函数&#xff1a;CONVERSION_EXIT_CUNIT_INPUT CALL FUNCTION ‘CONVERSION_EXIT_CUNIT_INPUT’ EXPORTING input “输入的中文单位 IMPORTING output “输出的英文单位 效果图&#xff1a;

SAP 中英文转换-英转中

英文转中文-函数&#xff1a;CONVERSION_EXIT_CUNIT_OUTPUT CALL FUNCTION ‘CONVERSION_EXIT_CUNIT_OUTPUT’ EXPORTING input “输入的英文单位 IMPORTING output “输出的中文单位

将数字转换为中文

功能需求 做公司项目遇到一个有关交易金额&#xff08;合同签订书&#xff09;的内容&#xff0c;需要将查询出来的交易金额转化为中文数字&#xff0c;例如&#xff1a;壹拾捌万伍仟元整&#xff08;185000.00&#xff09; 需求分析 因为合同书中的数据都是动态的&#xff0c…

Java 16进制报文转换中英文报文(通过字节转换)

最近在搞这个16进制报文,网上找了很多地方&#xff0c;解出来的结果不是乱码就是报错&#xff0c;干脆自己写了。 大概是这样的&#xff0c;16进制的报文大家都知道是什么样子 例如: 3C E4 BA A4 E6 98 93 E6 88 90 E5 8A 9F EF BC 81 3E 20 3C 42 61 6B 31 2F 3E 因为其中包…

通过C#进行中英文转换

通过C#进行中英文转换 编写相应语言的XML文件&#xff0c;添加xml文件 ChineseSimplified.xml文件内容 <?xml version"1.0" encoding"GB2312" ?> <Softimite Language"12"><Form><Name>LoginForm</Name><…

【Adobe After Effects中英文转换2019——2023版】

** Adobe After Effects中英文转换2019——2023版 ** 如果是默认安装的软件&#xff0c;在桌面右击AE图标&#xff0c;点击打开文件所在位置&#xff0c;来到软件安装目录 C:\Program Files\Adobe\Adobe After Effects 2023\Support Files 找到AMT文件夹 点击进入&#xf…

在线中英文符号转换工具

在线中英文符号转换工具 在线中英文符号转换工具 将中文符号转换成英文符号或将英文符号转换成中文符号&#xff0c; 将单引号‘’都转换成’&#xff0c; 将双引号“”都转换成" 将中括号【】转换成[]&#xff0c; 将大括号&#xff5b;&#xff5d;转换成{} 将逗号&…

英文表格如何快速转换为中文?

今天跟大家分享一下英文表格如何快速转换为中文&#xff1f; 1.首先打开Excel文件&#xff0c;选中要翻译的单元格&#xff0c;点击【DIY工具箱】 ​ 2.点击【翻译】 3.选择【有道翻译】 4.将翻译语言设置为中文&#xff0c;然后点击【确定】 5.鼠标点击一个合适的单元格作为翻…

英文转换-在线英文批量转换器免费

英文转换&#xff0c;怎么找到好的英文转换器&#xff1f;今天给大家分享一款免费批量的英文转换器汇集了世界最好的几个翻译平台&#xff08;百度/谷歌/有道&#xff09;&#xff0c;为什么这么多人使用它&#xff1f;首先第一点翻译质量高&#xff0c;选择性多。第二点可以批…

php 英文转中文,中文转换成英文

[php]代码库/** * 中文转换成英文 */ function pinyin($_String, $_Codegb2312){ $_DataKey "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha". "|chai|chan|chang|chao|che|chen|cheng|c…

C#小知识之中英文转换、去空格

一、中英文转换 1、安装NPinYin 2、编写代码 string str "这里是测试的中文字符串"; string str1 Pinyin.GetChineseText(str); string str2 Pinyin.GetInitials(str); string str3 Pinyin.GetPinyin(str);Console.WriteLine("取和拼音相同的汉字列表&…