HTTPX 是 Python 的一个现代 HTTP 客户端库,用于发送 HTTP 请求和处理响应。它是 requests
库的升级替代品,提供了同步和异步 API,支持 HTTP/1.1 和 HTTP/2,适合构建高性能的 Web 应用、API 调用和网络爬虫。以下是它的主要功能和用途:
主要功能
- 同步和异步支持:
- 同步 API:类似
requests
,适合简单脚本或顺序请求。 - 异步 API:基于
asyncio
或trio
,适合高并发场景,如同时处理多个请求。 - 示例:
# 同步
import httpx
response = httpx.get("https://example.com")
print(response.text)
# 异步
import asyncio
import httpx
async def main():
async with httpx.AsyncClient() as client:
response = await client.get("https://example.com")
print(response.text)
asyncio.run(main())
- HTTP/2 和连接池:
- 支持 HTTP/2,提升性能,尤其在高流量场景。
- 内置连接池,复用 TCP 连接,减少请求延迟。
- 功能丰富:
- 请求自定义:支持自定义 headers、查询参数、表单数据、JSON、文件上传等。
- 响应处理:自动解码 gzip、deflate 等压缩格式,支持 JSON 解析、流式响应。
- 超时控制:严格的超时设置,避免请求挂起。
- 认证支持:内置基本认证、OAuth 等机制。
- WebSocket 支持:适合实时应用。
- 命令行客户端:通过
pip install 'httpx[cli]'
安装,可直接从终端发送请求。
- 与 WSGI/ASGI 集成:
- 可直接向 WSGI/ASGI 应用发送请求,方便测试 Web 框架(如 Flask、FastAPI)。
- 类型注解:
- 完全类型化,支持静态类型检查,适合现代 Python 开发。
主要用途
- API 调用:与 RESTful API 交互,发送 GET、POST 等请求,处理 JSON 数据。
- Web 爬虫:抓取网页内容,支持流式处理大文件或实时数据。
- 实时应用:通过 WebSocket 处理实时通信。
- 测试:测试 Web 应用或 API 端点,模拟客户端行为。
- 高并发任务:异步请求适合批量处理或高吞吐量场景,如批量 API 调用或爬虫。
与 requests
的对比
- 相似性:API 设计类似
requests
,易于迁移。 - 优势:
- 支持异步和 HTTP/2,性能更强。
- 更现代的设计(类型注解、WebSocket)。
- 内置命令行工具。
- 劣势:对于简单同步任务,
requests
可能更轻量。
安装
pip install httpx
# 可选:安装 CLI 和 HTTP/2 支持
pip install 'httpx[cli,http2]'
实际场景示例
- API 调用:
import httpx
headers = {"Authorization": "Bearer token"}
response = httpx.get("https://api.example.com/data", headers=headers)
print(response.json())
- 上传文件:
import httpx
files = {"file": open("report.pdf", "rb")}
response = httpx.post("https://example.com/upload", files=files)
print(response.status_code)
- 异步并发请求:
import asyncio
import httpx
async def fetch_url(client, url):
response = await client.get(url)
return response.text
async def main():
async with httpx.AsyncClient() as client:
tasks = [fetch_url(client, f"https://example.com/page/{i}") for i in range(5)]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())
注意事项
- 性能优化:使用
httpx.Client
或httpx.AsyncClient
复用连接,避免每次请求创建新连接。 - 安全性:始终使用 HTTPS,谨慎处理敏感信息(如凭据)。
- 文档:官方文档(https://www.python-httpx.org)提供详细指南和高级用法。
总结
HTTPX 是一个功能强大、性能优越的 HTTP 客户端库,适合从简单 API 调用到复杂异步爬虫的各种场景。它结合了 requests
的易用性和现代 Python 的高性能特性,是 Python 网络编程的首选工具之一。