HTTPX从入门到放弃

1. 什么是HTTPX?

HTTPX是一款Python栈HTTP客户端库,它提供了比标准库更高级别、更先进的功能,如连接重用、连接池、超时控制、自动繁衍请求等等。HTTPX同时也支持同步和异步两种方式,因此可以在同步代码和异步代码中通用。

HTTPX功能如下:

1. 发送HTTP请求:HTTPX支持发送HTTP GET、POST等请求,并提供了丰富的选项进行定制化。

2. 请求头和查询参数:HTTPX可以方便地添加请求头和查询参数到HTTP请求中。

3. 超时设置:HTTPX支持对HTTP请求的超时时间进行设置,以避免长时间等待响应。

4. SSL/TLS证书验证:当使用HTTPS协议时,HTTPX可以验证SSL/TLS证书。

5. 文件上传和下载:HTTPX可以用于上传和下载文件。

6. Cookie管理:HTTPX可以管理cookie。

7. 连接池:HTTPX提供连接池以提高性能。

8. 异步请求:HTTPX支持异步请求,在异步代码中提供了更好的性能表现。

相比其他HTTP客户端库,HTTPX有以下优势:

  1. 性能更好:HTTPX采用异步IO模型实现高效的并发处理,使得其在处理大量数据和并发请求时比同类库要快得多。
  2. 功能更全面:HTTPX提供了更多的功能,如连接池、自动繁衍请求等等,使得它可以胜任更多不同的HTTP场景。
  3. 更为灵活:HTTPX提供了更多可用的选项以满足不同的HTTP场景和使用需求,从而使得它更为灵活。
  4. 更加安全:HTTPX在处理HTTPS请求时提供更完善的SSL/TLS证书验证机制,从而更加安全。

2. HTTPX功能

1. 发送HTTP请求

import httpx# 发送GET请求
response = httpx.get('https://www.example.com')
print(response.status_code)  # 状态码
print(response.text)  # 响应内容# 发送POST请求
data = {'name': 'example', 'age': 18}
response = httpx.post('https://www.example.com', data=data)
print(response.status_code)  # 状态码
print(response.text)  # 响应内容

2. 请求头和查询参数

HTTPX发送HTTP请求时往往需要在请求中添加一些头部信息或查询参数,下面介绍如何在HTTPX中添加和定制这些信息。

添加请求头

可以通过headers参数向HTTP请求中添加头部信息。以下是一个示例代码:

import httpxheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}response = httpx.get('https://www.example.com', headers=headers)print(response.status_code)
print(response.text)

可以看到,在发送GET请求时,使用了一个 headers 字典来指定请求头。其中 User-Agent 是模拟浏览器发送请求的标准请求头之一。可以根据实际需求添加更多的请求头信息。

添加查询参数

除了请求头外,还可以通过 params 参数向HTTP请求中添加查询参数。以下是一个示例代码:

import httpxparams = {'key1': 'value1', 'key2': 'value2'}response = httpx.get('https://www.example.com', params=params)print(response.status_code)
print(response.text)

在上述代码中,params 参数被用于将查询参数添加到 GET 请求中。具体而言,HTTPX 会根据键值对自动生成查询字符串并将其附加到 URL 的末尾,就像在浏览器中一样。

3. 超时设置

在发送HTTP请求时,往往需要设置超时时间以避免等待过长时间的响应。HTTPX 提供了设置超时时间的方法,下面介绍如何在 HTTPX 中设置超时时间:

发送单次请求时设置超时时间

可以通过 timeout 参数来设置单个请求的超时时间,单位为秒(s)。以下是一个示例代码:

import httpx# 设置 5 秒超时时间
timeout = httpx.Timeout(5)response = httpx.get('https://www.example.com', timeout=timeout)print(response.status_code)
print(response.text)

在上述代码中,timeout 参数被用于将超时时间设置为 5 秒。如果在 5 秒内没有收到服务器的响应,HTTPX 将自动取消该请求并抛出 httpx.ReadTimeout 异常。

全局设置超时时间

除了可以在单个请求中设置超时时间外,还可以全局设置所有请求的超时时间。可以通过创建一个 Client 实例并指定超时时间来实现。以下是一个示例代码:

import httpx# 全局设置 5 秒超时时间
client = httpx.Client(timeout=5)response = client.get('https://www.example.com')print(response.status_code)
print(response.text)

在上述代码中,创建了一个 Client 实例,并将超时时间设置为 5 秒。在之后的所有请求中,都会默认使用这个超时时间。需要注意的是,全局设置会影响所有请求,因此需要根据实际情况合理地设置超时时间。

4. 异步请求

异步请求示例

首先,需要安装异步标准库 asyncio 和 HTTPX 库。

安装完成后,就可以在 Python 脚本中使用异步请求了。以下是一个简单的异步 GET 请求示例:

import asyncio
import httpxasync def main():async with httpx.AsyncClient() as client:response = await client.get('https://www.example.com')print(response.status_code)print(response.text)asyncio.run(main())

在上述代码中,我们使用异步函数 main() 来发送异步 GET 请求。其中,使用了 httpx.AsyncClient() 创建了一个异步客户端实例,然后调用了 client.get() 函数来发送 GET 请求。

在异步请求中,需要使用关键字 await 等待异步操作执行完成,这样才能保证程序按照正确的顺序执行。

进一步使用示例

除了简单的 GET 请求外,HTTPX 还支持复杂的异步操作和定制化需求。以下是一个使用异步 POST 请求并上传文件的示例:

import asyncio
import httpxasync def main():async with httpx.AsyncClient() as client:# 上传文件files = {'file': ('example.txt', 'Hello, world!')}response = await client.post('https://www.example.com/upload', files=files)# 显示响应信息print(response.status_code)print(response.text)asyncio.run(main())

在上述代码中,使用了 client.post() 函数向服务器上传文件。其中,files 参数被用于指定上传的文件信息。

需要注意的是,在异步请求过程中,需使用 async with httpx.AsyncClient() as client: 的方式创建异步客户端实例,并通过 async/await 关键字等待异步操作完成,这样才能确保程序正确执行。

5. SSL/TLS证书验证

SSL/TLS证书验证是保证HTTP通信安全的重要手段之一。HTTPX提供了对SSL/TLS证书的验证机制,下面介绍如何在HTTPX中进行SSL/TLS证书验证:

验证服务器证书

HTTPX 默认会验证服务器证书,如果证书无效或不可信,则会抛出 httpx.RemoteProtocolError 异常。以下是一个示例代码:

import httpxresponse = httpx.get('https://www.example.com')print(response.status_code)
print(response.text)

在上述代码中,使用 httpx.get() 函数向服务器发送 GET 请求,并默认启动 SSL/TLS 证书验证。如果服务器证书无效,则 HTTPX 会抛出 httpx.RemoteProtocolError 异常。

禁用服务器证书验证

虽然 SSL/TLS 证书验证是确保通信安全的重要手段,但在一些特殊情况下需要禁用证书验证,例如调试时使用自签名证书等。可以通过将 verify 参数设置为 False 来禁用 SSL/TLS 证书验证。以下是一个示例代码:

import httpxresponse = httpx.get('https://www.example.com', verify=False)print(response.status_code)
print(response.text)

在上述代码中,verify=False 参数被用于禁用服务器证书验证。需要注意的是,这种方法会降低通信安全性,应谨慎使用。

指定客户端证书

除了验证服务器证书外,HTTPX 还支持指定客户端证书。可以通过 cert 参数来指定客户端证书和私钥文件的路径。以下是一个示例代码:

import httpxclient_cert = ('path/to/cert.pem', 'path/to/key.pem')response = httpx.get('https://www.example.com', cert=client_cert)print(response.status_code)
print(response.text)

在上述代码中,client_cert 变量被用于指定客户端证书和私钥的路径。需要注意的是,客户端证书应该由受信任的第三方机构颁发,并且应该进行保护。

6. 文件上传和下载

HTTPX支持文件上传和下载,可以通过httpx.post() 和 httpx.get() 函数向服务器上传和下载文件。下面分别介绍如何在 HTTPX 中进行文件上传和下载:

  1. 文件上传示例
    可以通过 files 参数来实现文件上传功能。以下是一个文件上传的示例代码:
import httpxwith open('example.txt', 'rb') as f:
files = {'file': ('example.txt', f)}
response = httpx.post('https://www.example.com/upload', files=files)print(response.status_code)
print(response.text)


在上述代码中,使用了 open() 函数打开本地文件,并将文件数据添加到 files 参数中。然后,使用 httpx.post() 函数向服务器发送 POST 请求并上传文件。

需要注意的是,('example.txt', f) 中,第一个参数是文件名,第二个参数是文件内容。具体而言,文件内容应该以二进制格式表示。

文件下载示例
可以通过 stream=True 参数将文件下载至内存中,并逐步写入本地文件。以下是一个文件下载的示例代码:

import httpxresponse = httpx.get('https://www.example.com/image.jpg', stream=True)with open('image.jpg', 'wb') as f:
for chunk in response.iter_bytes():
f.write(chunk)print(response.status_code)

在上述代码中,使用了 httpx.get() 函数向服务器发送 GET 请求。其中,stream=True 参数被用于启动响应流模式,这样可以将文件下载到内存中,然后逐步写入本地文件。需要注意的是,在下载大文件时,响应流模式可以减少内存占用并提高性能。

Cookie管理

HTTPX提供了用于管理Cookie的工具,可以通过httpx.CookieJar()对象来管理Cookie。下面介绍如何在HTTPX中进行Cookie管理:

使用CookieJar管理Cookie

可以使用 httpx.CookieJar() 对象来管理 Cookie。以下是一个示例代码:

import httpx# 创建 CookieJar 实例
cookie_jar = httpx.CookieJar()# 将 Cookie 添加到 CookieJar 中
cookie = httpx.cookies.Cookie(name='name', value='value')
cookie_jar.set_cookie(cookie)# 使用 CookieJar 发送请求
with httpx.Client(cookie_jar=cookie_jar) as client:response = client.get('https://www.example.com')print(response.status_code)

在上述代码中,首先创建了一个 httpx.CookieJar() 实例,并将 httpx.cookies.Cookie() 对象添加到 CookieJar 中。然后,在使用 HTTPX 发送请求时,通过 cookie_jar=cookie_jar 参数来指定使用 CookieJar 管理 Cookie。

需要注意的是,通过 set_cookie() 方法向 httpx.CookieJar() 添加 Cookie 后,这些 Cookie 将被自动附加到后续的 HTTP 请求中。

使用Session管理Cookie

除了使用 httpx.CookieJar() 对象管理 Cookie 外,还可以使用 httpx.Client() 对象的 Session 来管理 Cookie。以下是一个示例代码:

import httpx# 创建 Session 实例
session = httpx.Client()# 向 Session 中添加 Cookie
cookie = httpx.cookies.Cookie(name='name', value='value')
session.cookies.set_cookie(cookie)# 使用 Session 发送请求
response = session.get('https://www.example.com')print(response.status_code)

在上述代码中,通过 httpx.Client() 创建了一个 HTTP 客户端实例,并使用 session.cookies.set_cookie() 方法向 Session 中添加 Cookie。然后,在使用 HTTPX 发送请求时,不需要指定 cookie_jar 参数,而是使用 Session 自动管理 Cookie。

需要注意的是,httpx.Client() 的 Session 会自动保存并发送所有 Cookie,因此在发送多个 HTTP 请求时,可以方便地管理 Cookie。

连接池

HTTPX 是一个 Python 的异步 HTTP 客户端库。它支持连接池来重用已建立的 HTTP 连接,从而提高性能并减少网络延迟。

创建连接池

要创建连接池,请使用 httpx.AsyncClient() 构造函数并指定 limits 参数。

import httpxlimits = httpx.Limits(max_connections=100, max_keepalive=10)
client = httpx.AsyncClient(limits=limits)

此代码将创建一个最大连接数为 100,最大保持活动连接数为 10 的连接池。

使用连接池

一旦你创建了连接池,你可以像正常地发送请求一样使用 httpx.AsyncClient() 实例发送请求。在创建客户端时,HTTPX 将自动管理连接池中的连接。

response = await client.get("https://www.example.com")
print(response.text)

这将使用连接池中的空闲连接来发送 HTTP GET 请求,并返回响应。如果没有可用的连接,HTTPX 将自动创建一个新连接。

3. 使用HTTPX编写Web爬虫

import asyncioimport httpx
from bs4 import BeautifulSoupasync def fetch(url):async with httpx.AsyncClient() as client:response = await client.get(url)return response.textasync def scrape():url = "https://book.douban.com/top250"html = await fetch(url)soup = BeautifulSoup(html, "html.parser")books = []for book in soup.select(".indent > table"):title = book.select_one(".pl2 > a")["title"]link = book.select_one(".pl2 > a")["href"]rating = book.select_one(".rating_num").text.strip()author = book.select_one(".pl").text.strip().split("/")[0]books.append({"title": title, "link": link, "rating": rating, "author": author})return booksif __name__ == "__main__":books = asyncio.run(scrape())for book in books:print(book)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/256582.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA纯vhdl实现XGMII接口10G万兆网UDP协议 配合10G Ethernet PCS/PMA使用 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案本 10G-UDP 协议栈功能和性能描述本 10G-UDP 协议栈设计框图用户发送AXIS接口描述用户接收AXIS接口描述控制接口描述XGMII接口描述 4、vivado工程详解10G-UDP协议栈10G Ethernet PCS/PMA IP核 5、上板调试验证并演示6、福利&…

iOS 13修复了FaceTime最大的烦恼之一

黑客技术 点击右侧关注,了解黑客的世界! Java开发进阶 点击右侧关注,掌握进阶之路! Linux编程 点击右侧关注,免费入门到精通! iOS 13 第三个开发者 beta 版本增加了一个新功能,可以让用户在 Fac…

多人聊天、预约会议,FaceTime登录Windows和Android系统

整理 | Carol 出品 | CSDN(ID:CSDNnews) 在一年一度的WWDC苹果开发者盛会中,Apple除了宣布引入iOS15以外,还宣布将面向Windows和Android用户开放FaceTime。而过去,这项能力只能在iOS和Mac设备上试用。 Face…

iPhone曝严重漏洞,用户接听FaceTime前或被“监听”!

作者 | 琥珀 出品 | AI科技大本营(ID: rgznai100) 近日,据 9to5Mac 等多家外媒报道,苹果手机 FaceTime 一项重大漏洞被曝光,该漏洞可以让用户通过 FaceTime 群聊功能(Group FaceTime)打电话给任…

黑苹果facetime_如何在消息或FaceTime中添加或删除电话号码

黑苹果facetime If you have an iPhone and a Mac or iPad, you can link your phone number to your iCloud account to send and receive calls and messages from the same number on both devices. 如果您拥有iPhone和Mac或iPad,则可以将电话号码链接到iCloud帐…

苹果 iOS 15 正式发布

本文转载自IT之家 IT之家 6 月 8 日消息 今日凌晨,苹果召开 WWDC21 全球开发者大会,正式公布了全新 iOS 15 系统。 IT之家了解到,在 iOS 15 系统中,苹果带来了全新 FaceTime 与通知界面,并对照片、天气、钱包、地图等…

【苹果imessage相册推信】黑apple苹果经常出现FaceTime群设备推和Imessage群发设备推

黑色苹果经常出现FaceTime和Imessage,无法正常登录。 需要正常登录,你需要提到3码,一些帖子甚至复制在真正的白色苹果机上方。 但实际上,我希望上述服务将正常使用,我们需要补充SMUUID,BoardSerialNumber和…

FaceTime 在苹果电脑macOS与iPhone iOS上视频聊天配置步骤

FaceTime 在macOS与iPhone视频聊天配置步骤 前提,毫无疑问,你要有Apple ID。 1,在苹果电脑,到Applications目录下打开运行FaceTime 2,还是在电脑,输入你的Apple ID 3,还是在电脑,这里…

iMessage, Facetime 解决办法

不需要白苹果三码,亲测可用:原帖地址: https://www.reddit.com/r/hackintosh/comments/2wohwn/getting_imessage_working_on_10102_generating/ 感谢原帖的大神,感谢搜索。如果你得到一个错误信息,那么你很辛运。这意味…

【苹果推软件】安装OS imessage和faceTime

推荐内容IMESSGAE相关 作者推荐内容参考此文档来操作 *** 点击即可查看作者要求内容信息作者推荐内容1.参考此文档来操作 *** 点击即可查看作者要求内容信息作者推荐内容2.参考此文档来操作 *** 点击即可查看作者要求内容信息作者推荐内容3.参考此文档来操作 *** 点击即可查看…

如何解决FaceTime在苹果Mac上不起作用的问题?

由于多种原因,FaceTime无法在Mac上正常工作。在某些情况下,该应用程序行为不正常或将您注销,因此您将无法使用FaceTime。同样,如果您在使用相机或麦克风时遇到问题,Mac的日期和时间不正确,或者互联网连接状…

黑苹果解决 iMessage 与 Facetime 以及苹果三码的问题

教程来自http://www.heimac.net 若有侵权,及时私信我删除本文,再次感谢! 作者:超级管理员 黑苹果经常出现Facetime 和 iMessage 无法正常登陆。需要正常登陆则需要所说的白苹果 3 码,有些帖子甚至已经到真正的白苹果机…

C++ 和机器学习:使用 C++ 执行 ML 任务的简介

C 和机器学习:使用 C 执行 ML 任务的简介 介绍 C 是一种高性能编程语言,非常适合机器学习( ML ) 任务。尽管它在 ML 中可能不像 Python 或 R 那样流行,但它在速度和内存效率方面具有优势。 在本文中,我们将概述使用 C 执行 ML 任务…

【上篇】我们邀请了4位专家来探讨消费市场的新增量:W型机会、单客经济、日本市场、DTC......

好久不见了,我是增长黑盒的创始人yolo。最近我们总是发布一些严肃型的行业报告,相信大家的动作都是在第一时间点个收藏,然后....就没有然后了。 所以,今天我们的内容没有复杂的图表和数据,想用比较轻松的对话形式来呈现…

二、高通相机bringup 流程

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、相机Sensor 点亮相关的文件二、Sensor 驱动文件详解 一、相机Sensor 点亮相关的文件 1.1 Sensor 驱动XML以及CPP文件 Sensor 文件路径:…

react antd Modal里Form设置值不起作用

问题描述: react antd Modal里Form设置值不起作用,即使用form的api。比如:编辑时带出原有的值。 造成的原因:一般设置值都是在声明周期里设置,比如:componentDidMounted里设置,hook则在useEff…

Dockerfile

Docker镜像原理: docker镜像是由特殊的文件系统叠加而成最低端的是boofs,并使用宿主机的bootfs第二层是root文件系统rootfs,称为base image让再往上叠加其他的镜像文件统一文件系统(Union FileSystem)技术能够将不同的层整合成一个文件系统&…

CVPR 2023 | 南大王利民团队提出LinK:用线性核实现3D激光雷达感知任务中的large kernel...

点击下方卡片,关注“CVer”公众号 AI/CV重磅干货,第一时间送达 点击进入—>【Transformer】微信交流群 【CVPR 2023】LinK:用线性核实现3D激光雷达感知任务中的large kernel 本文介绍我们媒体计算研究组(MCG)在3D激…

Arm推出新一代高性能CPU内核Cortex-X4以及GPU Immortalis-720 GPU

每年差不多这个时候,智能手机芯片背后的大脑 Arm 都会推出高通、联发科等公司用于下一代SoC的构建模块。在 2023 年 Arm 技术日期间,Arm 推出了一系列涵盖高性能和低功耗用例的新 CPU 内核,以及其第五代 GPU,并提供光线追踪图形支…

Autohotkey按键映射

文章目录 功能前缀鼠标按键键盘按键虚拟键码和扫描码实操 功能前缀 尽管在初步使用中已经对常见热键做了说明&#xff0c;但为了本文的完整性&#xff0c;这里还是重新表述一下 #!^<^>!winAltCtrlShiftAlt Gr 其中&#xff0c;<, >为修饰符&#xff0c;用于区分…