К содержимому

Python requests ротация прокси: пул, шлюз, повторы

Два способа ротации, когда подходит каждый, и код повторов, который не тратит трафик на неверный логин.

Пул или шлюз: из чего вы выбираете

Пул — это список прокси, который вы храните и ротируете сами: каждая запись — один IP со своим хостом, портом и логином. Код решает, какой из них взять для запроса, и знает, какой из них дал сбой.

Шлюз — это одна точка входа. Вы отправляете все запросы на один адрес, а выходной IP выбирает сервис. Списка у вас нет, а ротация зависит от режима, выбранного при создании прокси.

Пул или шлюз: что подходит

Пул или шлюз: что подходит
ПунктПул IP в кодеШлюз
Кто выбирает выходной IPВаш код, из спискаСервис, по выбранному при создании режиму
Типичный продуктСтатические ISP, одна запись на IP; до 100 в заказеДинамические резидентные, оплата за ГБ
Если IP не работаетВы пропускаете его и берёте следующую записьВ режиме с ротацией новое соединение обычно получает другой IP
Один IP на несколько запросовИспользуйте ту же запись; в срок аренды IP не ротируетсяЛипкий режим или одна Session на одном соединении
Что вы поддерживаетеСписок, продления и даты окончанияОдну запись; страна задана в созданном прокси

Источники: файл фактов о продуктах и страница заказа Proxy302, 15 ноября 2026. Ни один из вариантов не обещает, как отреагирует целевой сайт.

Пул: по кругу и повтор на следующем 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]").

Session, соединения и почему IP повторяется

В документации 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.

Настройка с Proxy302

  1. Шаг 1. Выберите модель

    Для шлюза откройте страницу динамических резидентных прокси и выберите режим выхода: «выбор региона / новый IP на соединение» для независимых страниц или липкий для одного сценария. Для пула откройте страницу статических ISP и задайте количество IP, которое хотите в списке.

  2. Шаг 2. Протокол и создание

    Оставьте протокол HTTP (порт 2222) или выберите SOCKS5 (порт 3333), затем нажмите «Проверить цену и создать». У статических IP протокол фиксируется при покупке, по одному на IP.

  3. Шаг 3. Скопируйте данные

    В разделе «Мои активы» скопируйте HOST, PORT, USERNAME и PASSWORD в код выше.

  4. Шаг 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 на один день.

Частые вопросы

Как ротировать прокси в Python requests?

Либо держите список прокси и выбирайте один на каждый запрос в своём коде, либо отправляйте запросы на один шлюз в режиме «новый 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://, если хотите, чтобы домены резолвил прокси.

Ссылки и источники

4
  1. Requests: Advanced Usage

    Официальная документация · Проверено:

    Прочитано 15 ноября 2026: Session использует пул соединений urllib3 и повторно использует TCP-соединение к тому же хосту; аргумент proxies и то, что session.proxies могут перекрываться прокси из переменных окружения; логин и пароль пишутся в виде http://user:pass@host; socks5h резолвит DNS на стороне прокси; без явного значения таймаута нет; повторы делаются через urllib3 Retry, подключённый к HTTPAdapter.

  2. urllib3: Retry

    Официальная документация · Проверено:

    Прочитано 15 ноября 2026: у Retry есть total, backoff_factor и status_forcelist; пауза равна backoff_factor * 2 ** (число прошлых повторов); по умолчанию повторяются только идемпотентные методы; заголовок Retry-After учитывается для 413, 429 и 503.

  3. Страница заказа динамических резидентных прокси Proxy302

    Наблюдение за продуктом · Проверено:

    Поле «Режим выхода» проверено 15 ноября 2026: глобальная ротация, выбор региона / липкий IP и выбор региона / новый IP на соединение; форма по умолчанию стоит на липком варианте; новый IP выдаётся на соединение, а не на запрос.

  4. Факты о продуктах и прайс-лист 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 — настроить его в браузере можно за несколько минут.