Перейти к содержимому
Гайды 3 мин чтения 1 просмотров

Использование прокси в Python с httpx

Работа с прокси через httpx: синхронный и асинхронный режимы, SOCKS5, HTTP/2 через прокси и сравнение с requests.

httpx и прокси

httpx — современная HTTP-библиотека для Python, которая поддерживает как синхронный, так и асинхронный режим работы. Ключевое преимущество — встроенная поддержка HTTP/2 и SOCKS прокси без дополнительных библиотек.

Установка

pip install httpx
# Для SOCKS поддержки:
pip install httpx[socks]
# Для HTTP/2:
pip install httpx[http2]

Синхронный режим

HTTP прокси

import httpx

proxy = "http://user:pass@proxy_ip:port"
response = httpx.get("https://httpbin.org/ip", proxy=proxy)
print(response.json())

Разные прокси для HTTP и HTTPS

proxies = {
    "http://": "http://proxy1:port",
    "https://": "http://proxy2:port",
}

with httpx.Client(proxy=proxies) as client:
    response = client.get("https://httpbin.org/ip")
    print(response.json())

SOCKS5 прокси

import httpx

proxy = "socks5://user:pass@proxy_ip:port"
with httpx.Client(proxy=proxy) as client:
    response = client.get("https://httpbin.org/ip")
    print(response.json())

Асинхронный режим

Базовый пример

import httpx
import asyncio

async def fetch():
    proxy = "http://user:pass@proxy_ip:port"
    async with httpx.AsyncClient(proxy=proxy) as client:
        response = await client.get("https://httpbin.org/ip")
        print(response.json())

asyncio.run(fetch())

Параллельные запросы

import httpx
import asyncio

async def fetch_url(client, url):
    try:
        response = await client.get(url, timeout=10)
        return response.text
    except Exception as e:
        return None

async def main():
    proxy = "http://user:pass@proxy_ip:port"
    urls = [f"https://example.com/page/{i}" for i in range(50)]

    async with httpx.AsyncClient(proxy=proxy) as client:
        tasks = [fetch_url(client, url) for url in urls]
        results = await asyncio.gather(*tasks)
        success = sum(1 for r in results if r)
        print(f"Success: {success}/{len(urls)}")

asyncio.run(main())

HTTP/2 через прокси

httpx — одна из немногих Python-библиотек с поддержкой HTTP/2:

import httpx

proxy = "http://user:pass@proxy_ip:port"
with httpx.Client(proxy=proxy, http2=True) as client:
    response = client.get("https://httpbin.org/ip")
    print(f"HTTP version: {response.http_version}")
    print(response.json())

HTTP/2 через прокси работает через CONNECT-метод — прокси создаёт TCP-туннель, через который устанавливается HTTP/2 соединение с сервером.

Ротация прокси

import httpx
import random

PROXIES = [
    "http://user:pass@proxy1:port",
    "http://user:pass@proxy2:port",
    "http://user:pass@proxy3:port",
]

def get_random_proxy():
    return random.choice(PROXIES)

# Синхронная ротация
for i in range(10):
    proxy = get_random_proxy()
    with httpx.Client(proxy=proxy) as client:
        resp = client.get("https://httpbin.org/ip")
        print(resp.json())

Ротация в асинхронном режиме

import httpx
import asyncio
import random

PROXIES = [
    "http://user:pass@proxy1:port",
    "http://user:pass@proxy2:port",
    "http://user:pass@proxy3:port",
]

async def fetch_with_rotation(url):
    proxy = random.choice(PROXIES)
    async with httpx.AsyncClient(proxy=proxy) as client:
        try:
            resp = await client.get(url, timeout=10)
            return resp.text
        except Exception:
            return None

async def main():
    urls = ["https://example.com"] * 20
    tasks = [fetch_with_rotation(url) for url in urls]
    results = await asyncio.gather(*tasks)
    print(f"Success: {sum(1 for r in results if r)}")

asyncio.run(main())

Настройка клиента

Timeout

timeout = httpx.Timeout(
    connect=5.0,    # подключение к прокси и серверу
    read=10.0,      # чтение ответа
    write=5.0,      # отправка запроса
    pool=5.0        # ожидание в пуле соединений
)

client = httpx.Client(proxy=proxy, timeout=timeout)

Headers и cookies

headers = {
    "User-Agent": "Mozilla/5.0 ...",
    "Accept-Language": "en-US,en;q=0.9",
}

client = httpx.Client(
    proxy=proxy,
    headers=headers,
    follow_redirects=True,
    max_redirects=10
)

Пул соединений

limits = httpx.Limits(
    max_connections=100,          # всего соединений
    max_keepalive_connections=20  # keep-alive соединений
)

client = httpx.AsyncClient(proxy=proxy, limits=limits)

Обработка ошибок

import httpx

async def safe_fetch(client, url):
    try:
        response = await client.get(url)
        response.raise_for_status()
        return response.text
    except httpx.ProxyError as e:
        print(f"Proxy error: {e}")
    except httpx.ConnectTimeout:
        print("Connection timeout")
    except httpx.ReadTimeout:
        print("Read timeout")
    except httpx.HTTPStatusError as e:
        print(f"HTTP {e.response.status_code}")
    except httpx.RequestError as e:
        print(f"Request error: {e}")
    return None

httpx vs requests vs aiohttp

Параметр httpx requests aiohttp
Sync Да Да Нет
Async Да Нет Да
HTTP/2 Да Нет Нет
SOCKS Да (встроенный) Через requests-socks Через aiohttp-socks
Прокси в URL Да Да Да
API requests-совместимый Стандарт Свой
Производительность Высокая Средняя Высокая

Миграция с requests

httpx спроектирован как drop-in замена requests. Миграция минимальна:

# requests
import requests
resp = requests.get(url, proxies={"https": proxy})

# httpx
import httpx
resp = httpx.get(url, proxy=proxy)

Основное отличие: в httpx параметр proxy (единственное число) вместо proxies.

Заключение

httpx — лучший выбор для новых Python-проектов, требующих работы с прокси. Встроенная поддержка HTTP/2, SOCKS5, синхронного и асинхронного режимов делает его универсальным инструментом. Совместимый с requests API облегчает миграцию существующих проектов.

Обновлено: 06.03.2026
Назад к категории

Читайте также

Гайды 1 мин

Настройка прокси в Cypress для E2E-тестирования

Настройка прокси в Cypress: HTTP_PROXY переменные, cy-proxy-middleware и тестирование гео-зависимого контента.

Гайды 1 мин

Как автоматизировать закупку прокси через API

Автоматизация покупки и управления прокси через API провайдеров: интеграция, мониторинг расхода и auto-renewal.

Гайды 1 мин

Создание дашборда мониторинга прокси на Grafana

Пошаговое создание дашборда для мониторинга прокси в Grafana: метрики, Prometheus exporters и alerting.

Гайды 1 мин

Как тестировать прокси перед покупкой

Чеклист тестирования прокси перед покупкой: скорость, стабильность, анонимность, гео и совместимость с целевыми сайтами.

Гайды 1 мин

Как настроить sticky sessions через прокси

Sticky sessions (липкие сессии): сохранение одного IP на протяжении сессии, настройка через провайдера и самостоятельно.

Гайды 1 мин

Использование прокси с Camoufox

Camoufox — модифицированный Firefox для обхода антиботов. Настройка прокси, fingerprint и stealth-режим.

Попробуйте наши прокси

20,000+ прокси в 100+ странах мира