httpx 并非爬虫提速银弹,其 HTTP/2 需显式启用且依赖服务端支持与 h2/hpack 包,实测性能提升不足 4%;真正瓶颈在于 DNS、TLS、解析及反爬策略,优化连接池、超时和解析器更有效。

httpx 确实能提升部分场景下的采集效率,但它不是“开箱即用的提速银弹”——HTTP/2 支持本身在爬虫中收益有限,且默认不启用,盲目替换 requests 反而可能引入兼容性问题或性能倒退。
httpx 默认不走 HTTP/2,必须显式启用
httpx 的异步客户端默认使用 HTTP/1.1;要启用 HTTP/2,必须:
- 显式传入
http2=True - 且目标服务器明确支持 HTTP/2(可通过
curl -I --http2 <a href="https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635">https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635</a>验证) - 同时需安装
h2和hpack依赖(pip install httpx[http2])
否则你写的 httpx.AsyncClient() 实际跑的还是 HTTP/1.1,和 aiohttp 性能无本质差异。
常见错误现象:
立即学习“Python免费学习笔记(深入)”;
- 没装
httpx[http2]就设http2=True→ 报UnsupportedProtocol错误 - 服务器不支持 HTTP/2 → 自动降级为 HTTP/1.1,但连接复用逻辑更复杂,反而略慢
HTTP/2 对爬虫的真实收益很窄
HTTP/2 的核心优势(多路复用、头部压缩、服务端推送)在爬虫中多数失效:
- 多路复用要求同一域名下大量并发请求,而实际爬虫常受反爬限速约束(如每秒 1–3 请求),根本压不上去
- 头部压缩对小请求(如 GET)收益微乎其微
- 服务端推送几乎不被公开网站启用,爬虫也无从利用
实测对比(100 个同域名请求,目标站支持 HTTP/2):
-
httpx.AsyncClient(http2=True):约 8.2 秒 -
aiohttp.ClientSession()(HTTP/1.1 + 连接池):约 8.5 秒 - 差距不到 4%,远不如调优并发数或重试策略来得实在
真正拖慢爬虫的,从来不是协议版本,而是 DNS 查询、TLS 握手、响应体解析、反爬等待这些环节。
替换 requests 前,先确认你是否真需要 httpx
httpx 的合理使用场景是:
- 项目已重度依赖异步生态,且需要同步/异步双模式统一 API(
httpx.Client()/httpx.AsyncClient()) - 必须调用明确要求 HTTP/2 的内部 API(如某些云厂商控制台接口)
- 需要原生支持 HTTP/3(
httpx3.x+ 支持,aiohttp不支持)
如果你只是想提速,优先做这些:
- 用
aiohttp替代requests+ 多线程(更成熟、连接池更稳) - 在
aiohttp中配置connector = aiohttp.TCPConnector(limit=100, limit_per_host=30) - 加入超时控制:
timeout=aiohttp.ClientTimeout(total=10, connect=5) - 解析层换
lxml,别用BeautifulSoup+html.parser
httpx 的 HTTP/2 支持是个技术亮点,但不是爬虫效率瓶颈的解药。真正卡住进度的,往往是一行没写的 time.sleep(2),或一个没配的连接池大小。


















