Два способа ротации, когда подходит каждый, и код повторов, который не тратит трафик на неверный логин.
Пул или шлюз: из чего вы выбираете
Пул — это список прокси, который вы храните и ротируете сами: каждая запись — один IP со своим хостом, портом и логином. Код решает, какой из них взять для запроса, и знает, какой из них дал сбой.
Шлюз — это одна точка входа. Вы отправляете все запросы на один адрес, а выходной IP выбирает сервис. Списка у вас нет, а ротация зависит от режима, выбранного при создании прокси.
# pip install requests
import itertools
import time
import requests
# One entry per static IP, copied from My assets (LOGIN:PASSWORD@HOST:PORT)
POOL = [
"http://LOGIN1:PASSWORD1@HOST1:PORT1",
"http://LOGIN2:PASSWORD2@HOST2:PORT2",
"http://LOGIN3:PASSWORD3@HOST3:PORT3",
]
URL = "https://ipinfo.io/ip"
ring = itertools.cycle(POOL) # round robin; random.choice(POOL) also works
def fetch(url, tries=3):
last = None
for attempt in range(tries):
proxy = next(ring) # a failed try moves on to the next IP in the pool
try:
r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=(5, 20))
if r.status_code not in (429, 502, 503, 504):
return r
except (requests.exceptions.ProxyError,
requests.exceptions.Timeout,
requests.exceptions.ConnectionError) as exc:
last = exc
time.sleep(0.5 * 2 ** attempt) # 0.5 s, 1 s, 2 s
raise RuntimeError("gave up after %d tries: %s" % (tries, last))
for _ in range(6):
print(fetch(URL).text.strip())
Только пример: подставьте HOST, PORT, LOGIN и PASSWORD каждого IP из раздела «Мои активы». Если в пароле есть символы вроде @ или :, закодируйте его через urllib.parse.quote(password, safe='') перед вставкой в URL.
Шлюз: новая Session для нового IP и без повтора на 407
# pip install requests
import time
import requests
GATEWAY = "http://LOGIN:PASSWORD@HOST:PORT" # one gateway entry from My assets
PROXIES = {"http": GATEWAY, "https": GATEWAY}
URL = "https://ipinfo.io/ip"
def fetch(url, tries=3):
last = None
for attempt in range(tries):
# A new Session starts with an empty connection pool, so it opens a new connection.
# In "new IP per connection" mode that is what gives you a new exit IP.
with requests.Session() as s:
try:
r = s.get(url, proxies=PROXIES, timeout=(5, 20))
except requests.exceptions.ProxyError as exc:
if "407" in str(exc):
raise # wrong login: a retry only repeats the refusal
last = exc
except (requests.exceptions.Timeout, requests.exceptions.ConnectionError) as exc:
last = exc
else:
if r.status_code not in (429, 502, 503, 504):
return r
time.sleep(0.5 * 2 ** attempt)
raise RuntimeError("gave up after %d tries: %s" % (tries, last))
print([fetch(URL).text.strip() for _ in range(5)])
Только пример. Сначала создайте прокси в режиме «новый IP на соединение», затем скопируйте HOST, PORT, LOGIN и PASSWORD из «Мои активы». Для HTTP порт динамических резидентных — 2222, для SOCKS5 — 3333, а схема в URL становится socks5h:// (pip install "requests[socks]").
В документации Requests сказано, что Session использует пул соединений urllib3, поэтому несколько запросов к одному хосту повторно используют одно TCP-соединение. В режиме шлюза, где IP меняется на соединение, именно это и объясняет, почему IP не меняется между вызовами. requests.get() вне Session каждый раз создаёт временную Session и открывает новое соединение.
Ещё одна ловушка: по предупреждению из документации, session.proxies могут быть перекрыты прокси из переменных окружения. Передавайте proxies в каждом вызове, как в примерах, чтобы код использовал именно тот прокси, который вы задумали.
Если для входа или многошагового сценария нужен один IP, не боритесь с соединением: берите липкий режим или один статический IP и держите одну Session на весь сценарий.
Повторяйте таймауты, сбросы соединения, 429 и 502, 503, 504. После каждого сбоя ждите дольше: urllib3 Retry считает паузу как backoff_factor * 2 ** (число прошлых повторов) и учитывает Retry-After для 429 и 503. Ограничьте число попыток.
Не повторяйте 407: прокси отказал в логине, и следующая попытка получит тот же ответ. Не отвечайте на поток 429 от целевого сайта добавлением IP: снизьте частоту, потому что лимит про скорость запросов. Повторяйте только то, что безопасно отправить дважды; для urllib3 по умолчанию это идемпотентные методы.
Если нужен путь через библиотеку, подключите Retry(total=3, backoff_factor=0.5, status_forcelist=[429, 502, 503, 504]) к HTTPAdapter, как в документации Requests. Ручной цикл удобнее, когда между попытками надо ещё и менять IP.
Для шлюза откройте страницу динамических резидентных прокси и выберите режим выхода: «выбор региона / новый IP на соединение» для независимых страниц или липкий для одного сценария. Для пула откройте страницу статических ISP и задайте количество IP, которое хотите в списке.
Оставьте протокол HTTP (порт 2222) или выберите SOCKS5 (порт 3333), затем нажмите «Проверить цену и создать». У статических IP протокол фиксируется при покупке, по одному на IP.
Шаг 3. Скопируйте данные
В разделе «Мои активы» скопируйте HOST, PORT, USERNAME и PASSWORD в код выше.
Шаг 4. Запустите и посмотрите вывод
Запустите скрипт. С пулом вы увидите записи по очереди; со шлюзом в режиме «на соединение» пять IP в списке должны меняться от вызова к вызову.
Ожидаемый результат Список выходных IP от ipinfo.io.
Разбор проблем
Шлюз возвращает один и тот же IP при каждом вызове
Проверьте Вы используете одну Session или создали прокси в липком режиме?
Решение Открывайте новую Session на каждый запрос или создайте новый прокси в режиме «новый IP на соединение»; уже созданные прокси при смене режима не меняются.
Когда остановиться Если и новая Session даёт тот же IP, проверьте через curl -x, чтобы отделить код от прокси.
ProxyError с 407
Проверьте LOGIN и PASSWORD скопированы полностью, спецсимволы закодированы?
Решение Скопируйте заново из «Мои активы» и закодируйте пароль через urllib.parse.quote; не гоняйте это в цикле повторов.
Когда остановиться Если после точного копирования всё равно отказ, создайте тикет с номером заказа.
Таймауты на каждом запросе
Проверьте Верны ли HOST, PORT и протокол (на шлюзе HTTP 2222, SOCKS5 3333)?
Решение Исправьте порт или протокол, держите таймаут соединения коротким и добавьте цикл с паузами из примера.
Когда остановиться Запись пула, которая раз за разом даёт таймаут: пропустите её и проверьте дату окончания в «Мои активы».
Поток 429 от целевого сайта
Проверьте Сколько запросов в секунду вы отправляете?
Решение Снизьте частоту и добавьте паузу; Retry учитывает Retry-After для 429.
Когда остановиться Слишком высокую частоту запросов добавлением IP не исправить.
Цены и ограничения
Динамические резидентные прокси оплачиваются за ГБ: Бюджетная линия стоит $1,50 за ГБ ($1,35 за ГБ в пакете 100 ГБ), Премиум-линия — $5,00 за ГБ. Статический ISP-IP стоит $0,50 за один день и $7,99 за 30 дней, около $0,27 в день (7,99 / 30). Бесплатного пробного периода нет, минимальная покупка — 1 ГБ или один IP на один день.
Либо держите список прокси и выбирайте один на каждый запрос в своём коде, либо отправляйте запросы на один шлюз в режиме «новый IP на соединение» и открывайте новую Session на каждый запрос.
Почему мой requests.Session всё время даёт один IP?
Session повторно использует TCP-соединение к тому же хосту, а шлюз в режиме «на соединение» меняет IP только при открытии нового соединения. Берите новую Session на запрос или прокси, созданный в режиме «на соединение».
Нужно ли повторять запрос при ошибке 407?
Нет. 407 означает, что прокси отказал в логине, и повтор даст тот же ответ. Сначала исправьте LOGIN и PASSWORD.
Сколько ждать между повторами?
Увеличивайте паузу после каждого сбоя. urllib3 Retry считает backoff_factor * 2 ** (число прошлых повторов) секунд, поэтому при backoff_factor 0,5 ждать нужно 0,5 с, 1 с, 2 с и так далее.
Нужен ли requests[socks] для SOCKS5?
Да. Установите его командой pip install "requests[socks]" и используйте URL socks5h://, если хотите, чтобы домены резолвил прокси.
Прокси для парсинга: реальные домашние IP в 195+ странах и регионах, ротация или липкая сессия в выбранной стране (крупный город — на премиум-линии), от $1,50/ГБ, HTTP и SOCKS5.
Реальные домашние IP в 195+ странах; премиум-линия добавляет таргетинг по штату и крупному городу. Смена IP на каждое новое подключение или липкие сессии. От $1,50/ГБ, $1,35/ГБ при 100 ГБ. HTTP и SOCKS5.
Прочитано 15 ноября 2026: Session использует пул соединений urllib3 и повторно использует TCP-соединение к тому же хосту; аргумент proxies и то, что session.proxies могут перекрываться прокси из переменных окружения; логин и пароль пишутся в виде http://user:pass@host; socks5h резолвит DNS на стороне прокси; без явного значения таймаута нет; повторы делаются через urllib3 Retry, подключённый к HTTPAdapter.
Прочитано 15 ноября 2026: у Retry есть total, backoff_factor и status_forcelist; пауза равна backoff_factor * 2 ** (число прошлых повторов); по умолчанию повторяются только идемпотентные методы; заголовок Retry-After учитывается для 413, 429 и 503.
Поле «Режим выхода» проверено 15 ноября 2026: глобальная ротация, выбор региона / липкий IP и выбор региона / новый IP на соединение; форма по умолчанию стоит на липком варианте; новый IP выдаётся на соединение, а не на запрос.
Факты о продуктах и прайс-лист Proxy302
Наблюдение за продуктом · Проверено:
Файл фактов о продуктах сайта, проверен 15 ноября 2026: динамические резидентные прокси, Бюджетная линия $1,50 за ГБ ($1,35 за ГБ в пакете 100 ГБ) и Премиум-линия $5,00 за ГБ; статический ISP за IP $0,50 за 1 день и $7,99 за 30 дней; порты шлюза HTTP 2222 и SOCKS5 3333; от 1 до 100 статических IP в заказе; бесплатного пробного периода нет.
Готовы попробовать?
Создайте аккаунт, пополните баланс и выберите ротируемый резидентный, статический ISP или дата-центр IP — настроить его в браузере можно за несколько минут.