Настройка прокси в Scrapy

Scrapy с прокси Prokso: HttpProxyMiddleware, прокси в meta запроса с логином и паролем, новый IP на порту 823, фиксированные порты для сессий.

Обновлено · Редакция Prokso

Данные для подключения
Хост
gw.prokso.com
Порт
823 HTTP · 824 SOCKS5 — новый IP на каждый запрос · 10000–20000 фиксированный IP (sticky-сессия), HTTP(S) и SOCKS5
Логин и пароль
в кабинете, на странице плана

Готовые строки в нужном формате генерирует кабинет: выберите страну, тип IP и протокол.

Коротко
  • Хост — gw.prokso.com, порты 823 (HTTP), 824 (SOCKS5), 10000–20000 (фиксированный IP, HTTP или SOCKS5)
  • Логин и пароль — в кабинете на странице плана
  • Проверяйте IP в ответе самого запроса через прокси: страница «Мой IP» в браузере ваш скрипт не проверяет
Прокси в Scrapy: короткая видеоинструкция · 0:28

Пошаговая инструкция, как подключить прокси Prokso в Scrapy. Займёт несколько минут.

Шаг 1. Возьмите данные прокси в кабинете

Откройте план и скопируйте хост gw.prokso.com, порт, логин и пароль. Порт 823 — HTTP, 824 — SOCKS5 (оба дают новый IP на каждый запрос); порты 10000–20000 — фиксированный IP до 120 минут, работают и как HTTP, и как SOCKS5 (каждый порт — отдельный адрес). Страну задают в логине: логин__cr.ua.

Блок «Доступ» на странице плана: хост, порты, логин и пароль для строки прокси
Блок «Доступ» на странице плана: хост, порты, логин и пароль для строки прокси

Шаг 2. Проверьте, что HttpProxyMiddleware включён

В Scrapy он работает по умолчанию (HTTPPROXY_ENABLED = True), ничего дополнительно устанавливать не нужно. Если вы отключали его в settings.py, верните.

Шаг 3. Передайте прокси в meta запроса

Укажите meta={"proxy": ...} с логином и паролем прямо в адресе. Scrapy сам превратит их в заголовок авторизации для прокси. Порт 823 даёт новый IP на каждый запрос.

import scrapy

PROXY = "http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823"

class IpSpider(scrapy.Spider):
    name = "ip"

    def start_requests(self):
        yield scrapy.Request("https://api.ipify.org?format=json",
                             meta={"proxy": PROXY})

    def parse(self, response):
        yield response.json()

Шаг 4. Фиксированные IP для сессий

Если паук логинится или ходит по страницам, где важен один IP, распределите запросы по фиксированным портам 10000–20000: одна сессия — один порт.

# one sticky port per account
PORTS = [10001, 10002, 10003]

def proxy_for(i):
    return f"http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:{PORTS[i % len(PORTS)]}"

# in the request: meta={"proxy": proxy_for(i)}

Шаг 5. Проверьте IP в результате

Сохраните паука из примера в файл ip_spider.py и запустите scrapy runspider ip_spider.py. Он обратится к https://api.ipify.org и выведет в лог собранный элемент с IP — это должен быть IP прокси, а не ваш.

Пример запуска: в логе паука — собранный элемент с IP прокси
Пример запуска: в логе паука — собранный элемент с IP прокси

Настройки проекта под работу через прокси

Стандартные значения Scrapy рассчитаны на прямое соединение. Через прокси стоит уменьшить число одновременных запросов к одному сайту, включить автоматическую подстройку скорости и ограничить повторы:

# settings.py
CONCURRENT_REQUESTS = 8
CONCURRENT_REQUESTS_PER_DOMAIN = 4
DOWNLOAD_TIMEOUT = 30
AUTOTHROTTLE_ENABLED = True          # slows down when the site responds slowly
RETRY_TIMES = 2
RETRY_HTTP_CODES = [502, 503, 504, 408]
COMPRESSION_ENABLED = True           # compressed responses use less traffic

В RETRY_HTTP_CODES оставьте только временные сбои. Коды 403 и 429 приходят от сайта: повторять их сразу бессмысленно, а трафик тратится на каждый ответ.

Прокси для всех запросов сразу

Чтобы не писать meta в каждом запросе, добавьте прокси в небольшом промежуточном обработчике. Он должен стоять раньше встроенного HttpProxyMiddleware:

# middlewares.py
class ProksoProxyMiddleware:
    def process_request(self, request, spider):
        request.meta.setdefault("proxy", spider.settings["PROXY_URL"])

# settings.py
PROXY_URL = "http://USERNAME:PASSWORD@gw.prokso.com:823"
DOWNLOADER_MIDDLEWARES = {"myproject.middlewares.ProksoProxyMiddleware": 350}

Как тратить меньше трафика

Scrapy загружает только HTML, без картинок и скриптов, поэтому сам по себе расходует немного. Основные потери — повторные обходы. Включите HTTPCACHE_ENABLED на время отладки паука: страницы будут браться с диска, а не через прокси. Перед запуском оцените объём в калькуляторе трафика.

Вопросы и ответы

Можно ли задать прокси для всего проекта сразу?

Да: HttpProxyMiddleware читает переменные окружения <code>http_proxy</code> и <code>https_proxy</code>. Но значение в <code>meta</code> имеет приоритет, так что для отдельных запросов его можно переопределить.

Что делать с ошибками 407?

Это значит, что прокси не принял логин или пароль. Скопируйте их ещё раз со страницы плана и проверьте, что в пароле нет символов, которые нужно кодировать в URL.

Как менять IP на каждом запросе?

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

Сайт отвечает 403 на все запросы. Дело в прокси?

Обычно нет: это ответ сайта. Проверьте заголовки запроса, в первую очередь User-Agent, уменьшите скорость и попробуйте другой тип прокси. Подробнее — на странице <a href="/ru/errors/403-forbidden">ошибки 403</a>.

Работает ли прокси со scrapy-playwright?

Да, но прокси там задаётся в параметрах запуска браузера, а не через <code>meta["proxy"]</code>.