Python网络请求库从 requests 到 httpx的迁移
作者:曦远Code
前言
如果说 Python 有哪个库改变了互联网开发的门槛,requests 绝对榜上有名。
它用极简的 API 终结了 urllib2 那个混乱的时代。
直到今天,requests.get(url) 依然是很多程序员下意识写出的第一行爬虫代码。
但随着 Python 异步生态(Asyncio)的全面爆发,以及 HTTP/2 协议的普及,这个诞生于 2011 年的老兵开始显露疲态。
PS:为什么 AI 时代还要亲自钻研新技术?
因为 AI 的底色是“过去”。
如果你不掌握先进的工具,AI 就会用它的“经验惯性”把你留在旧时代。
只有你懂新东西,才能指挥 AI 写出更现代的代码。
AI 的本质是“概率模型”,它更倾向于给出训练数据中最常见、最保守的方案(往往也就是旧方案)
HttpX
httpx 并不是要推翻 requests,而是要完成它的现代化改造。它的核心口号是:“几乎完全兼容 Requests API,但原生支持异步。”
新项目切换到 httpx 的理由:
- 原生异步支持: 在处理成千上万个 API 调用时,同步的
requests会让你的程序在等待网络 IO 时“死掉”。而httpx配合async/await,可以在一秒钟内并发处理极高密度的请求,而不消耗多余的线程资源。 - 支持 HTTP/2: 相比 HTTP/1.1,HTTP/2 支持多路复用。这意味着在同一个连接上可以并行发送多个请求,大幅降低了延迟。
- 严格的超时管理:
requests默认永不超时,这在生产环境中是极其危险的。而httpx默认开启超时检查,更加符合现代微服务的健壮性要求。
例子
如果你熟悉 requests,迁移到 httpx 的成本几乎为零。
同步写法对比(几乎一致)
# Requests
import requests
resp = requests.get("https://api.github.com/events")
# HTTPX
import httpx
resp = httpx.get("https://api.github.com/events")异步写法
import httpx
import asyncio
async def fetch_tech_news():
async with httpx.AsyncClient() as client:
# 同时发起多个请求,效率起飞
tasks = [client.get(f"https://news.com/api/{i}") for i in range(10)]
responses = await asyncio.gather(*tasks)
return [r.json() for r in responses]
asyncio.run(fetch_tech_news())对比
| 特性 | Requests | HTTPX |
|---|---|---|
| 异步支持 | ❌ (需借助线程池) | ✅ 原生支持 (Async/Await) |
| HTTP/2 | ❌ | ✅ 支持 |
| API 友好度 | 极高 | 极高 (兼容 Requests) |
| 类型提示 | 一般 | ✅ 完善 (完美契合 IDE) |
| 适用场景 | 简单脚本、小型爬虫 | Web 异步框架、高并发采集、现代化工程 |
小结
异步虽然好用,但有些坑:
httpx的AsyncClient最好使用async with上下文管理器,否则容易造成连接泄露。- 在 Windows 环境下使用异步 loop 要额外注意(如
SelectorEventLoop的限制)
补充知识:
从 requests 到 httpx 的迁移,不仅仅是换一个库,更是一次从同步到异步、从 HTTP/1.1 到 HTTP/2 的性能与架构升级。
为了方便你快速理解和决策,这里先用一个表格直观对比两者的核心差异:
| 特性 | requests | httpx |
|---|---|---|
| 核心定位 | 同步HTTP库,API简洁优雅 | 新一代HTTP客户端,同时支持同步和异步API |
| 异步支持 | ❌ 不支持 | ✅ 支持 (httpx.AsyncClient) |
| HTTP/2 | ❌ 不支持 | ✅ 支持 (需安装httpx[http2]) |
| 连接池 | 通过 requests.Session 实现 | 内置更高效的 httpx.Client 和 httpx.AsyncClient |
| 默认超时 | ⚠️ 无默认超时,需手动设置 | ✅ 默认5秒(连接、读取、写入等各阶段) |
| 重定向 | 自动跟随 | 需显式设置 follow_redirects=True |
| API兼容性 | - | 与 requests 高度相似,代码修改成本低 |
🚀 为什么选择 httpx?
选择 httpx 绝不仅仅是为了“追新”,它解决了许多 requests 在实际生产中的痛点:
- 性能飞跃:对于I/O密集型任务(如爬虫、调用多个API),使用
httpx的异步客户端可以成倍提升效率。在本地测试中,发送1000个请求,httpx异步比requests同步快了约6倍。 - 现代化的协议支持:
requests基于urllib3,仅支持 HTTP/1.1。而httpx支持 HTTP/2,其多路复用特性可以在一个连接上并发处理多个请求,有效降低延迟。 - 更健壮的默认配置:
requests的一个常见“坑”是默认不设置超时,可能导致请求无限期挂起。httpx默认设置了5秒超时,使程序更加健壮。
🔄 如何从 requests 迁移到 httpx?
好消息是,httpx 在设计上充分考虑了与 requests 的兼容性,迁移路径非常平滑。
1. 基础用法替换
绝大多数情况下,你只需要把代码中的 requests 替换为 httpx 即可。例如,一个简单的 GET 请求:
# 使用 requests
import requests
resp = requests.get('https://api.example.com/data')
print(resp.json())
# 使用 httpx (同步方式)
import httpx
resp = httpx.get('https://api.example.com/data')
print(resp.json())POST 请求的 json 和 data 参数用法也完全一致-3。
2. 使用连接池优化性能
如果你需要复用TCP连接(比如频繁请求同一个网站),requests 使用 Session,而 httpx 则使用 Client:
# requests
with requests.Session() as session:
session.get('https://api.example.com/user')
session.post('https://api.example.com/post', json={'key': 'value'})
# httpx
with httpx.Client() as client:
client.get('https://api.example.com/user')
client.post('https://api.example.com/post', json={'key': 'value'})3. 进阶:拥抱异步,释放并发潜力
这是 httpx 的核心优势。当需要同时获取100个网页时,异步的优势尽显无疑:
import httpx
import asyncio
async def fetch_data(url):
async with httpx.AsyncClient() as client:
resp = await client.get(url)
return resp.json()
async def main():
urls = ['https://api.example.com/item/1', 'https://api.example.com/item/2'] # ... 更多URL
tasks = [fetch_data(url) for url in urls]
results = await asyncio.gather(*tasks)
print(f"成功获取 {len(results)} 个结果")
asyncio.run(main())4. 开启 HTTP/2 支持
在安装时选择 http2 额外依赖,并在创建客户端时简单配置即可享受 HTTP/2 带来的性能提升:
pip install httpx[http2]
with httpx.Client(http2=True) as client:
resp = client.get('https://cloud.google.com') # 支持HTTP/2的网站
print(resp.http_version) # 输出: HTTP/2⚠️ 需要注意的几个关键区别
虽然API高度相似,但有几个行为差异是迁移时容易忽略的:
- 重定向不再自动:
requests会自动跟随重定向,而httpx需要显式声明:client.get(url, follow_redirects=True)。 - 超时设置更严格:
httpx的5秒默认超时可能会让之前依赖无限等待的代码报错,建议在开发测试阶段关注这一点,并根据实际情况调整超时时间。
💎 总结
- 继续使用
requests:如果你只是在写一个简单的脚本,或者项目完全不需要异步和高性能,requests依然是一个稳定且优秀的选择。 - 升级到
httpx:如果你的应用需要处理高并发的网络请求、需要HTTP/2支持、或者你正在使用FastAPI等异步框架,那么从requests切换到httpx是顺应趋势的明智之选。它不仅功能更强大,也代表了Python HTTP客户端未来的方向。
建议:你可以在新项目中直接尝试使用 httpx。对于已有项目,可以评估一下是否有性能瓶颈,再决定是否逐步替换。
到此这篇关于Python网络请求库,从 requests 到 httpx的文章就介绍到这了,更多相关Python网络请求库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
