URL прокси#
Каждая HTTP-библиотека Python принимает прокси в виде URL. В Proxy Cyber URL содержит учётные данные и параметры таргетинга в имени пользователя; имя хоста указывает шлюз, а порт выбирает протокол.
# Ротация IP: новый домашний выходной узел в США при каждом новом подключении
http://USER-cc-us:PASS@res.proxy-cyber.com:9000
# Закреплённая сессия: один домашний выходной узел в Берлине на 30 минут с идентификатором "job42"
http://USER-cc-de-city-berlin-sid-job42-ttl-30m:PASS@res.proxy-cyber.com:9000
# SOCKS5 с удалённым DNS (socks5h), параметры те же
socks5h://USER-cc-us:PASS@res.proxy-cyber.com:9001requests#
Повторное использование соединений и назначение IP — разные механизмы. Сессия клиента сохраняет сокеты, а ротацию и закрепление адреса определяет выданный шлюз. Используйте параметры сессии из своего заказа и проверьте выходной IP несколькими запросами. Закрытие сокета или заголовок Connection: close не гарантируют новый адрес.
import requests
PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"
proxies = {"http": PROXY, "https": PROXY}
# Один запрос — один выходной узел
r = requests.get("https://api.ipify.org", proxies=proxies, timeout=30)
print(r.text)
# Закреплённая последовательность: один выходной узел для всех запросов этой сессии
sticky = "http://USER-cc-de-city-berlin-sid-cart42-ttl-15m:PASS@res.proxy-cyber.com:9000"
s = requests.Session()
s.proxies = {"http": sticky, "https": sticky}
s.get("https://example.com/product/1", timeout=30)
s.post("https://example.com/cart", json={"id": 1}, timeout=30)httpx#
httpx принимает один аргумент proxy= (в старых версиях — proxies=). Библиотека поддерживает HTTP/2 до цели через туннель CONNECT и работает так же в асинхронном коде.
import httpx
PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"
with httpx.Client(proxy=PROXY, timeout=30) as client:
print(client.get("https://api.ipify.org").text)
# Асинхронный режим: один закреплённый выходной узел на задачу
import asyncio
async def fetch(sid: str, url: str) -> str:
proxy = f"http://USER-cc-us-sid-{sid}-ttl-10m:PASS@res.proxy-cyber.com:9000"
async with httpx.AsyncClient(proxy=proxy, timeout=30) as client:
return (await client.get(url)).text
asyncio.run(fetch("task1", "https://api.ipify.org"))aiohttp#
aiohttp позволяет задавать прокси для каждого запроса или сессии и изначально поддерживает HTTP-прокси; для SOCKS5 требуется коннектор aiohttp-socks.
import aiohttp, asyncio
PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"
async def main():
async with aiohttp.ClientSession() as session:
async with session.get("https://api.ipify.org", proxy=PROXY, timeout=aiohttp.ClientTimeout(total=30)) as r:
print(await r.text())
asyncio.run(main())Ротация IP, keep-alive и повторные попытки#
- Новое TCP-соединение — это новое транспортное соединение, а не доказательство смены выхода. Маршрут определяет режим ротации, назначенный на шлюзе.
- Используйте отдельный идентификатор сессии для каждого независимого сценария, если выданный шлюз поддерживает эту настройку. Допустимый срок и параметры географии проверяйте в реквизитах подключения. Резидентское устройство может отключиться раньше указанного срока: закреплённая сессия не гарантирует один IP на несколько дней. Для постоянного адреса сравните выделенные статические продукты.
- Перед повтором определите причину ответа. Код 403 может означать правило доступа, которое смена IP не устранит. При 429 учитывайте Retry-After и снижайте частоту; для временных сетевых и серверных ошибок используйте ограниченные повторы с увеличением паузы. Операции, изменяющие данные, повторяйте только с защитой от дублирования.
- Настройте тайм-ауты с учётом типа выходного узла: для резидентских прокси 15 с на подключение и 45 с на чтение, для мобильных — больше.
Как экономить гигабайты#
Трафик резидентских прокси оплачивается за гигабайт в обоих направлениях. Запрашивайте сжатые ответы (в этих библиотеках Accept-Encoding: gzip, br включён по умолчанию), предпочитайте конечные точки JSON страницам HTML и не загружайте изображения, шрифты и мультимедиа, если они не являются нужными данными. Страница размером 350 КБ обходится дёшево, а страница размером 4 МБ с ресурсами — нет.
Частые вопросы#
Почему requests постоянно возвращает один и тот же IP-адрес?
Повторяющийся IP может объясняться пулом соединений, закреплённой сессией или доступным пулом выходов. Проверьте назначенный режим и выполните несколько запросов с отметками времени. requests.Session управляет соединениями и cookie, но сам не выбирает выходной IP.
Нужен ли другой прокси для сайтов HTTPS?
Нет. Тот же URL прокси с http:// обслуживает цели HTTPS через туннель CONNECT; TLS-соединение устанавливается напрямую между вашим кодом и сайтом.
Можно ли использовать тот же код для мобильных прокси?
Да: замените res.proxy-cyber.com на mob.proxy-cyber.com. Порты, учётные данные и параметры одинаковы.