TL;DR
使用 HTTPX,将一个代理 URL 传递给 AsyncClient(proxy=...),在请求之间重用客户端,并使用信号量限制并发。为了轮换,分配一个小的工作池给代理端点,而不是为每个 URL 创建新的客户端。重试应有限制,可观测,并限制于瞬态故障。
配置 HTTPX 代理
HTTPX 直接支持代理路由。其 官方代理文档 涵盖了 proxy 参数和传输挂载;其 异步指南 推荐重用客户端,以便连接池可以正常工作。
pip install httpx
import asyncio import httpx PROXY = "http://USERNAME:PASSWORD@gate.example:8000" async def main(): timeout = httpx.Timeout(20.0, connect=10.0) limits = httpx.Limits(max_connections=20, max_keepalive_connections=10) async with httpx.AsyncClient( proxy=PROXY, timeout=timeout, limits=limits, follow_redirects=True, ) as client: response = await client.get("https://example.com/authorized-page") response.raise_for_status() print(response.status_code, len(response.content)) asyncio.run(main())
在生产环境中使用环境变量或秘密管理器存储凭据。不要将它们提交到源控制中。
思维模型: 异步增加了同时工作的数量;它不会增加目标的安全请求预算。
在不破坏连接池的情况下轮换代理
此示例将 URL 分配给长寿命客户端。它使用有限的并发,并返回结构化的结果。用授权的 Nstdata 代理 端点替换占位符端点。
import asyncio import itertools import httpx URLS = [ "https://example.com/page/1", "https://example.com/page/2", ] PROXIES = [ "http://USER:PASS@gate-1.example:8000", "http://USER:PASS@gate-2.example:8000", ] async def fetch(client, url, semaphore): async with semaphore: try: r = await client.get(url) r.raise_for_status() return {"url": url, "status": r.status_code, "bytes": len(r.content)} except httpx.HTTPError as exc: return {"url": url, "error": type(exc).__name__} async def main(): semaphore = asyncio.Semaphore(8) clients = [ httpx.AsyncClient(proxy=p, timeout=20, follow_redirects=True) for p in PROXIES ] try: tasks = [ fetch(client, url, semaphore) for url, client in zip(URLS, itertools.cycle(clients)) ] print(await asyncio.gather(*tasks)) finally: await asyncio.gather(*(client.aclose() for client in clients)) asyncio.run(main())
示例输出:
[{'url': 'https://example.com/page/1', 'status': 200, 'bytes': 12480}, {'url': 'https://example.com/page/2', 'error': 'ReadTimeout'}]
仅重试可能恢复的内容
重试连接错误、超时、429 和选定的 5xx 响应,使用指数回退和抖动。不要重试身份验证失败或每个 4xx。限制尝试次数,并记录代理端点、目标主机、延迟、状态和最终结果,而不记录凭据。
对于依赖于 cookie 的多请求流,粘性会话效果更佳。轮换在允许的情况下更适合独立请求。每个请求都更改代理可能会破坏连接复用,并使故障排除变得更困难。
常见故障
407 Proxy Authentication Required:凭据或端点格式错误。- TLS 错误:验证证书;不要将验证作为一般修复禁用。
429:减少并发并遵循Retry-After。- 重复的挑战页面:停止并确认访问规则,而不是升级规避。
- 异步时延迟更高:并发限制过高或上游饱和。
最终判决
可靠的 HTTPX 代理模式是重用的 AsyncClient、明确的超时、有限的并发、结构化的错误和保守的重试。当位置或会话路由是真实需求时,使用 Nstdata 代理端点,并测量可用响应,而不是原始请求量。
体验 Nstdata — 今日开始免费试用
常见问题
HTTPX 支持 SOCKS 代理吗?
是的,使用可选的 SOCKS 依赖项。请查看当前的 HTTPX 安装和代理文档。
一个 AsyncClient 应该在任务之间共享吗? 是的,当这些任务共享配置和生命周期时。客户端重用可以实现连接池。
我应该发送多少个并发请求?
从少量开始,并仅在目标授权的速率和您测量的错误预算内增加。





