
在生产环境中使用环境变量或秘密管理器存储凭据。不要将它们提交到源控制中。
思维模型: 异步增加了同时工作的数量;它不会增加目标的安全请求预算。
此示例将 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:凭据或端点格式错误。429:减少并发并遵循 Retry-After。可靠的 HTTPX 代理模式是重用的 AsyncClient、明确的超时、有限的并发、结构化的错误和保守的重试。当位置或会话路由是真实需求时,使用 Nstdata 代理端点,并测量可用响应,而不是原始请求量。
HTTPX 支持 SOCKS 代理吗?
是的,使用可选的 SOCKS 依赖项。请查看当前的 HTTPX 安装和代理文档。
一个 AsyncClient 应该在任务之间共享吗? 是的,当这些任务共享配置和生命周期时。客户端重用可以实现连接池。
我应该发送多少个并发请求?
从少量开始,并仅在目标授权的速率和您测量的错误预算内增加。
1.1 亿+ 真实 IP,访问成功率达 99.9%
平均响应约 0.5 秒,支持高并发任务
低至 $0.1/GB