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

Scrapy и ротация прокси: middleware и повторы

Рабочая настройка прокси в Scrapy, важные правила повторов и как не нагружать сайты.

Один адрес и два способа его задать

Ротационный прокси — это один HOST и PORT с логином и паролем; IP выхода меняется на стороне сервиса, список IP вести не нужно. Scrapy берёт прокси из ключа meta proxy, а логин и пароль можно указать в URL: http://username:password@some_proxy_server:port. Значение в meta приоритетнее переменных окружения http_proxy и https_proxy.

Если прокси нужен только части запросов, задавайте его в нужных Request; если всем — используйте небольшой downloader middleware. Переменные окружения и спецсимволы в пароле разобраны в руководстве по настройке прокси в Scrapy; эта страница — про ротацию и повторы.

Downloader middleware, который задаёт прокси

# middlewares.py
class ProxyMiddleware:
    def process_request(self, request, spider):
        # Only set it when the request does not carry its own proxy.
        request.meta.setdefault("proxy", "http://LOGIN:PASSWORD@HOST:PORT")

# settings.py
DOWNLOADER_MIDDLEWARES = {
    "myproject.middlewares.ProxyMiddleware": 350,
}

Только пример. Приоритет 350 срабатывает раньше встроенного HttpProxyMiddleware, который читает значение из meta.

Ротация — это не один IP на запрос

Ротационный адрес даёт новый IP на каждое новое подключение. Scrapy может держать соединение открытым и посылать по нему несколько запросов, поэтому несколько запросов могут идти с одного IP. Не предполагайте «один IP на запрос»: запишите IP выхода в лог, как в пауке ниже, и потом решайте.

Если задача должна остаться на одном адресе, например вход и несколько страниц после него, создайте прокси в режиме одного IP («Выбор региона / липкий IP») и держите эти запросы вместе. Для независимых страниц подойдёт режим «Выбор региона / новый IP на соединение».

Паук, который печатает IP выхода

import scrapy

PROXY = "http://LOGIN:PASSWORD@HOST:PORT"

class IpCheckSpider(scrapy.Spider):
    name = "ip_check"

    def start_requests(self):
        for i in range(5):
            yield scrapy.Request(
                "https://ipinfo.io/ip?n=%d" % i,
                meta={"proxy": PROXY, "max_retry_times": 3},
                dont_filter=True,
            )

    def parse(self, response):
        self.logger.info("exit IP: %s", response.text.strip())

Только пример. Подставьте прокси из «Мои активы», запустите scrapy crawl ip_check и прочитайте IP в логе. start_requests остаётся классической точкой входа; в новых версиях Scrapy есть ещё асинхронный start().

Какие коды ответа повторять

Какие коды ответа повторять
ПунктПовтор по умолчаниюЧто делать
408, 500, 502, 503, 504, 522, 524ДаПусть RetryMiddleware повторяет, с паузой
429ДаСайт просит снизить темп: уменьшите частоту и учитывайте Retry-After
403, 404НетПовтор даст тот же ответ; проверьте URL и правила сайта
407НетПрокси отклонил логин и пароль: исправьте LOGIN и PASSWORD, не повторяйте

Источник: документация Scrapy по downloader middleware (RETRY_HTTP_CODES по умолчанию), прочитана 12.11.2026; колонка «Что делать» — рекомендация. В разных версиях Scrapy значения могут отличаться.

Настройки повторов и «вежливости»

# settings.py
ROBOTSTXT_OBEY = True
DOWNLOAD_TIMEOUT = 30

# retries (the documented defaults)
RETRY_ENABLED = True
RETRY_TIMES = 2                      # extra tries after the first download
RETRY_HTTP_CODES = [408, 429, 500, 502, 503, 504, 522, 524]

# be gentle with the target site
DOWNLOAD_DELAY = 1.0
CONCURRENT_REQUESTS_PER_DOMAIN = 4
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 1.0
AUTOTHROTTLE_MAX_DELAY = 30.0
AUTOTHROTTLE_TARGET_CONCURRENCY = 2.0

Только пример. RETRY_TIMES — число дополнительных попыток после первой загрузки. Для отдельного запроса можно задать meta["max_retry_times"] или meta["dont_retry"] = True, чтобы пропустить повторы.

AutoThrottle и задержки

AutoThrottle по умолчанию выключен. Включённый, он считает задержку по скорости ответов сайта, не опускается ниже DOWNLOAD_DELAY, а ответы не 200 не могут её сократить — при ошибках сбор замедляется, а не ускоряется. По умолчанию START_DELAY равен 5.0, MAX_DELAY 60.0, TARGET_CONCURRENCY 1.0.

Оставьте ROBOTSTXT_OBEY включённым, задайте DOWNLOAD_DELAY и CONCURRENT_REQUESTS_PER_DOMAIN явно, не полагаясь на значения по умолчанию, и прочитайте условия сайта. Прокси меняет, откуда идут запросы, но не меняет, сколько запросов выдержит сайт.

Настройка за четыре шага

  1. Шаг 1. Создайте прокси

    На странице динамических резидентных прокси выберите страну, режим выхода и HTTP или SOCKS5, затем создайте. HTTP использует порт 2222, SOCKS5 — порт 3333.

  2. Шаг 2. Добавьте прокси

    Скопируйте HOST, PORT, LOGIN и PASSWORD из «Мои активы» и задайте meta["proxy"] или подключите middleware.

  3. Шаг 3. Проверьте IP выхода

    Запустите паука ip_check и прочитайте пять IP в логе.

    Ожидаемый результат Пять IP из выбранной страны.

  4. Шаг 4. Добавьте настройки повторов и задержек

    Вставьте настройки, запустите небольшой сбор и посмотрите число повторов и ответов 429 в статистике Scrapy в конце.

Диагностика

Все ответы 407 или прокси не отвечает

Проверьте Значение в meta — полный URL со схемой, LOGIN и PASSWORD скопированы точно?

Решение Исправьте URL, закодируйте спецсимволы пароля и сначала проверьте через curl -x.

Когда остановиться Не увеличивайте RETRY_TIMES: неверный пароль даёт ошибку каждый раз.

Много ответов 429

Проверьте Посмотрите CONCURRENT_REQUESTS_PER_DOMAIN, DOWNLOAD_DELAY и заголовок Retry-After.

Решение Снизьте параллельность, увеличьте задержку, включите AutoThrottle.

Когда остановиться Если 429 продолжаются при низкой частоте, сайт может не разрешать такой сбор; остановитесь.

Страницы после входа теряют сессию

Проверьте Менялся ли IP выхода между входом и следующей страницей?

Решение Для такого сценария используйте режим одного IP и держите запросы вместе.

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

Как использовать ротационный прокси в Scrapy?

Задайте request.meta["proxy"] = http://LOGIN:PASSWORD@HOST:PORT в каждом Request или в небольшом downloader middleware.

Какие коды Scrapy повторяет по умолчанию?

408, 429, 500, 502, 503, 504, 522 и 524, до RETRY_TIMES дополнительных попыток (по умолчанию 2). Сверьтесь с документацией вашей версии Scrapy.

Нужно ли повторять 403 или 407?

Нет. 407 значит, что прокси отклонил логин и пароль — исправьте их; 403 обычно повторяется, поэтому проверьте URL и правила сайта.

Получает ли каждый запрос новый IP?

Не обязательно. Новый IP приходит с новым соединением, а Scrapy может отправить несколько запросов по одному. Запишите IP выхода в лог, чтобы увидеть, что происходит у вас.

Сколько стоят динамические резидентные прокси Proxy302?

Бюджетная линия — $1,50 за ГБ, в больших пакетах за ГБ дешевле; купленный трафик не сгорает. Бесплатного теста нет.

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

5
  1. Факты о продуктах Proxy302 и прайс

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

    Файл фактов сайта, проверен 12.11.2026: динамические резидентные, новый IP на каждое новое подключение, есть режим одного IP, HTTP порт 2222 и SOCKS5 порт 3333 на proxy.proxy302.com, Бюджетная линия $1,50 за ГБ, бесплатного теста нет.

  2. Документация Scrapy: Downloader Middleware

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

    Прочитано 12.11.2026: HttpProxyMiddleware берёт прокси из ключа meta proxy, принимает http://username:password@some_proxy_server:port, значение meta приоритетнее переменных окружения; RetryMiddleware по умолчанию RETRY_ENABLED True, RETRY_TIMES 2, RETRY_HTTP_CODES [408, 429, 500, 502, 503, 504, 522, 524]; ключи meta max_retry_times и dont_retry; RobotsTxtMiddleware управляется ROBOTSTXT_OBEY.

  3. Документация Scrapy: расширение AutoThrottle

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

    Прочитано 12.11.2026: по умолчанию выключено; AUTOTHROTTLE_START_DELAY 5.0, AUTOTHROTTLE_MAX_DELAY 60.0, AUTOTHROTTLE_TARGET_CONCURRENCY 1.0; задержка считается по латентности, не опускается ниже DOWNLOAD_DELAY, ответы не 200 не могут её сократить.

    Значения по умолчанию взяты из версии документации для разработки; сверьтесь с вашей версией Scrapy.

  4. Документация Scrapy: Settings

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

    Прочитано 12.11.2026: DOWNLOAD_DELAY — минимум секунд между двумя подряд запросами к одному домену; CONCURRENT_REQUESTS_PER_DOMAIN ограничивает одновременные запросы к одному домену; ROBOTSTXT_OBEY заставляет Scrapy соблюдать robots.txt; DOWNLOAD_TIMEOUT — время ожидания загрузчика до таймаута.

  5. MDN: 429 Too Many Requests

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

    Прочитано 12.11.2026: 429 — слишком много запросов за период; Retry-After может указать, сколько ждать.

Готовы попробовать?

Создайте аккаунт, пополните баланс и выберите ротируемый резидентный, статический ISP или дата-центр IP — настроить его в браузере можно за несколько минут.