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. Ограничьте количество попыток и записывайте эндпоинт прокси, целевой хост, задержку, статус и окончательный результат, не записывая учетные данные.
Липкие сессии работают лучше для многозапросных потоков, которые зависят от куки. Ротация работает лучше для независимых запросов, когда это разрешено. Изменение прокси на каждом запросе может разрушить повторное использование подключений и усложнить диагностику.
Общие ошибки
407 Proxy Authentication Required: неверные учетные данные или формат эндпоинта.- Ошибки TLS: проверьте сертификаты; не отключайте проверку как общее решение.
429: уменьшите параллелизм и соблюдайтеRetry-After.- Повторные страницы вызова: остановитесь и подтвердите правила доступа, а не эскалируйте уклонение.
- Высокая задержка с асинхронностью: лимит параллелизма слишком высок или upstream перегружен.
Окончательный вердикт
Надежный шаблон прокси HTTPX — это повторно используемый AsyncClient, явные тайм-ауты, ограниченный параллелизм, структурированные ошибки и осторожные повторные попытки. Используйте эндпоинты прокси Nstdata, когда местоположение или маршрутизация сессий являются реальным требованием, и измеряйте полезные ответы, а не общий объем запросов.
Попробуйте Nstdata — начните бесплатный пробный период сегодня
FAQ
Поддерживает ли HTTPX прокси SOCKS?
Да, с дополнительной зависимостью SOCKS. Следуйте текущей документации по установке и прокси HTTPX.
Должен ли один AsyncClient использоваться разными задачами? Да, когда эти задачи разделяют конфигурацию и жизненный цикл. Повторное использование клиента позволяет использовать пул соединений.
Сколько одновременно запросов я должен отправить?
Начните с низких значений и увеличивайте только в пределах разрешенной скорости целевого объема и вашего измеренного бюджета ошибок.





