Python网络请求库,从 requests 到 httpx

张开发
2026/4/10 0:21:00 15 分钟阅读

分享文章

Python网络请求库,从 requests 到 httpx
如果说 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.1HTTP/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(fhttps://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())对比#特性RequestsHTTPX异步支持❌ (需借助线程池)✅原生支持 (Async/Await)HTTP/2❌✅支持API 友好度极高极高 (兼容 Requests)类型提示一般✅完善 (完美契合 IDE)适用场景简单脚本、小型爬虫Web 异步框架、高并发采集、现代化工程小结#异步虽然好用但有些坑httpx的AsyncClient最好使用async with上下文管理器否则容易造成连接泄露。在 Windows 环境下使用异步 loop 要额外注意如SelectorEventLoop的限制

更多文章