Scrapy

Как настроить учетные данные прокси в Scrapy

Опубликовано 15 Sep 2026 · Scrapy, прокси, учетные данные, middleware, Python

Как настроить учетные данные прокси в Scrapy

1. Когда учетные данные прокси важны при обходе

Проекты Scrapy быстро сталкиваются с этой проблемой: прокси работает, а затем целевой сайт начинает запрашивать аутентификацию. Это обычная ситуация для сервисов с ротацией, частных пулов дата-центров и фиксированных корпоративных прокси. Если вы разбираетесь, как настроить учетные данные прокси в Scrapy, ключевой момент прост: это нужно делать в коде паука или middleware, а не в сетевых настройках уровня системы. Иными словами, чтобы настроить прокси с логином и паролем в Scrapy, лучше держать логику рядом с запросами, а не в конфигурации ОС.

Прокси с именем пользователя и паролем меняет обработку запроса в тот момент, когда Scrapy формирует сам запрос. Настройка в терминале не может решить, какой паук получит какой прокси, или какая повторная попытка должна переключиться на другой набор учетных данных. Если вы спрашиваете себя, как передать proxy credentials в Scrapy, ответ почти всегда сводится к тому, что Scrapy сам выполняет HTTP-работу, поэтому решение о прокси должно находиться рядом с объектом запроса. Так поведение привязано к обходу, а не к машине.

Представьте обход с 3 целями. Один домен допускает общий прокси, одному нужен отдельный логин, а один endpoint блокирует первый прокси после 20 запросов. Если настроить прокси на уровне ОС, все 3 запроса будут выглядеть одинаково. Если настроить его в Scrapy, каждый запрос может нести свои данные прокси. Эта разница важна уже при первом неудачном ответе.

Scrapy также делает выбор прокси видимым в коде. Вы можете открыть паука, downloader middleware или callback запроса и точно увидеть, где назначается прокси. Это сложнее, когда прокси живет в shell-профиле на ноутбуке разработчика. Одно место. Одно решение.

2. Выберите, где будут храниться учетные данные в проекте Scrapy

Есть 4 практичных места для хранения учетных данных прокси в проекте Scrapy: settings.py, настройки, специфичные для паука, переменные окружения или конфигурация пользовательского middleware. У каждого варианта своя узкая область применения. Глобальные учетные данные для одного обхода можно хранить в settings.py; паук, который обращается к одному поставщику, может иметь собственную настройку; переменные окружения подходят для развертывания; конфигурация middleware удобна, когда несколько пауков используют один и тот же формат входа.

Жестко прописывать учетные данные в исходниках — худший вариант, даже для приватного репозитория. Коммит может быть скопирован, зеркален, закэширован и просмотрен большим числом людей, чем вы ожидаете. Одной случайной отправки достаточно. Храните в коде только имя настройки, а секрет подставляйте во время выполнения. Так проект Scrapy остается переносимым, и позже не придется устраивать уборку.

Если ваша команда уже использует конфигурационные файлы, держите имя пользователя и пароль прокси вне самого класса паука. Поместите значения в переменные времени развертывания, а затем считывайте их через os.environ или загрузчик настроек. Для быстрого локального теста временное значение в settings.py может подойти, но относитесь к нему как к одноразовому. Оно не должно пережить неделю.

Для более широкого обзора связанных терминов глоссарий VPN и прокси поможет, если в одном тикете проект смешивает термины proxy, VPN и auth. Маленькое различие — большой эффект. Учетные данные прокси — это не то же самое, что логин от VPN.

3. Добавьте прокси с учетными данными через метаданные запроса

Самый прямой способ — прикреплять аутентифицированный прокси к одному запросу за раз. Scrapy поддерживает метаданные запроса, и ключ proxy отлично туда подходит. Это дает контроль на уровне каждого запроса, что полезно, когда одному обходу нужны несколько идентичностей прокси или когда один паук обращается к страницам с разными правилами доступа. На практике именно так часто и решают, Scrapy proxy authentication meta должна использоваться для конкретного запроса или для целого набора запросов.

Типичный запрос может выглядеть так:

yield scrapy.Request(
    url,
    callback=self.parse_page,
    meta={
        "proxy": "http://user:[email protected]:8000"
    }
)

Этот пример намеренно простой. Он показывает структуру, а не полный паук. Запрос передает прокси в meta, и Scrapy направляет этот запрос через аутентифицированный прокси. Если провайдер требует другой схемы, измените префикс в соответствии с сервисом. Один запрос может использовать один прокси; следующий — другой.

Здесь есть полезный побочный эффект. Вы можете держать endpoints с логинами на одном прокси, а публичные страницы пропускать через другой. Это снижает шум в логах и упрощает анализ повторных попыток. Если один запрос не проходит, вы знаете, какой прокси использовался, потому что он прикреплен к этому объекту запроса, а не спрятан в каком-то глобальном слое.

Практическая деталь: не разбрасывайте строки прокси по десятку callback-функций. Вынесите назначение прокси в один вспомогательный метод, а затем вызывайте его везде, где пауку это нужно. Даже небольшой паук становится проще для аудита, когда логика прокси живет в одном месте.

4. Подставляйте учетные данные прокси через downloader middleware

Для более крупного проекта Scrapy downloader middleware часто оказывается более аккуратным вариантом. Middleware может назначать request.meta["proxy"] для всех подходящих запросов, а при необходимости — то же самое делать для заголовка авторизации или другой обработки auth, если это ожидает ваш прокси-сервис. Так код паука остается сосредоточенным на целевых страницах, а не на прокладке учетных данных.

Это хорошо работает, когда правило простое: все запросы паука A используют один прокси, или все запросы к одному домену используют один аутентифицированный прокси. Middleware может проверить URL, имя паука или собственный флаг запроса, а затем установить прокси до того, как запрос попадет в downloader. Никаких ручных повторов. Никакого копипаста в callback-функциях.

Вот схема логики:

class ProxyAuthMiddleware:
    def process_request(self, request, spider):
        if getattr(spider, "use_proxy", False):
            request.meta["proxy"] = spider.proxy_url

Этот фрагмент минимален, и таким он и должен оставаться. В реальном проекте можно добавить выбор учетных данных, проверки домена или переопределения для отдельных пауков. Важнее всего расположение. Middleware обрабатывает запрос до загрузки, а именно там назначению прокси и место, если правило действует широко.

Небольшое замечание: если прокси-сервис ожидает отдельный заголовок auth вместо учетных данных в URL прокси, middleware все равно остается правильным местом. Вы можете один раз собрать заголовок, а затем переиспользовать его для всех запросов. Это избавляет каждый паук от необходимости заново изобретать тот же код.

Для связанных решений по настройке стоит посмотреть руководство по лучшим практикам прокси-аутентификации, если вашей команде нужен принцип, где должна жить логика auth. Это особенно важно, когда один и тот же аккаунт прокси используют больше одного паука.

5. Обрабатывайте прокси, которым нужны имя пользователя и пароль

URL аутентифицированного прокси обычно следует простой схеме: схема, имя пользователя, пароль, хост и порт. Во многих настройках Scrapy учетные данные можно встроить прямо в URL прокси, например http://user:pass@host:port. Точный формат зависит от типа прокси и провайдера, поэтому перед публикацией кода в production проверьте документацию сервиса.

Есть 2 распространенных варианта. В первом URL прокси уже содержит имя пользователя и пароль, и Scrapy читает всю строку из request.meta["proxy"]. Во втором хост прокси хранится отдельно, а данные авторизации управляются в другом месте, часто через middleware или правило, зависящее от провайдера. Первый вариант проще тестировать. Второй проще централизовать.

Если вы встраиваете учетные данные в URL, относитесь к строке как к секрету. Она появится в логах, если неосторожно печатать объекты запроса. Она также может оказаться в инструментах отладки или stack trace. Одного утекшего URL достаточно, чтобы раскрыть аккаунт. Это уже ошибка безопасности, а не просто неаккуратная строка в логах.

Некоторые провайдеры прокси используют имена пользователей с дополнительными сегментами, например названия зон, ID сессий или теги стран. Это может достаточно сильно изменить формат URL и сломать пример, вставленный бездумно. Один раз прочитайте формат у провайдера, а затем один раз точно закодируйте его в коде. Прокси должен соответствовать провайдеру, а не наоборот.

6. Проверьте, что Scrapy действительно использует аутентифицированный прокси

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

Порядок middleware здесь имеет значение. Более поздний middleware может перезаписать более раннее назначение прокси, и это может происходить незаметно. Если одно middleware устанавливает прокси, а другое изменяет запрос, проверьте порядок в settings.py. Один неверно расположенный класс может превратить корректный аутентифицированный прокси в обычное исходящее соединение. На небольших обходах это легко пропустить.

Поведение ответа тоже многое говорит. Прокси с неверными учетными данными часто возвращает статус 407, а корректный прокси может вернуть целевую страницу, страницу блокировки или ответ echo с другим IP. Если вы тестируете сервис, который сообщает ваш IP, сравните вывод с ожидаемым расположением прокси. Можно также свериться с тем, как проверить, что ваш IP скрыт, прежде чем доверять обходу.

Практическая проверка: запустите 5 запросов с повышенным уровнем логирования, а затем сравните хост прокси в каждой строке. Если все 5 запросов указывают на один и тот же аутентифицированный прокси, ваше middleware или метаданные запроса работают. Если один запрос игнорирует прокси, ищите callback, который строит собственный запрос без общего helper. Такое случается чаще, чем команды готовы признать.

7. Ротируйте или переключайте учетные данные прокси по домену или типу запроса

Некоторым задачам Scrapy нужен не один набор учетных данных. Розничный сайт может разрешать один аккаунт прокси для страниц товаров и другой для страниц оформления заказа. Поисковый обход может требовать разные прокси для разных доменов, а повторная попытка может нуждаться в новом идентификаторе сессии. В таком случае решение о прокси должно приниматься по простому правилу: по домену, по имени паука или по типу запроса.

Самое удобное место для такой логики обычно — middleware, потому что оно может проверять каждый исходящий запрос до загрузки. Вы можете переключать учетные данные, когда целевой домен совпадает со списком, или когда запрос несет собственный флаг вроде meta["proxy_group"]. Это делает паука понятным и убирает жестко зашитые ветвления из каждого callback.

Повторные попытки требуют отдельного обращения. Если один прокси блокируется после 2 попыток, retry может выбрать другой набор учетных данных до повторной отправки запроса. Это не то же самое, что случайная ротация; это контролируемый fallback. Для более широкого подхода к этой схеме см. руководство по ротации прокси для web scraping. Оно хорошо сочетается с логикой retry в Scrapy.

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

8. Не храните учетные данные прокси в системе контроля версий

Обработка секретов — это то, что люди исправляют в последнюю очередь, и то, что потом кусает первым. Не храните учетные данные прокси в системе контроля версий: считывайте их из переменных окружения во время выполнения, а затем подставляйте в настройки Scrapy или конфигурацию middleware во время развертывания. Это работает на ноутбуке, в контейнере и в CI-задаче без изменения кода паука.

Пайплайн развертывания может установить PROXY_URL, PROXY_USER или PROXY_PASS до запуска Scrapy. Затем паук читает эти значения и формирует строку аутентифицированного прокси. Это делает кодовую базу чище и превращает ротацию учетных данных в задачу конфигурации, а не в изменение кода. Смена пароля не должна требовать нового коммита.

Будьте осторожны с логами, тестовыми фикстурами и файлами-примерами. Фальшивая строка прокси в тесте все равно может выглядеть достаточно правдоподобно, чтобы ее скопировали в тикет. Файл .env должен оставаться вне репозитория. Секрет развертывания должен оставаться в системе развертывания. Эти две границы просты, но их легко размыть, если дедлайн близко.

Если в проекте используются несколько поставщиков прокси, задокументируйте, какие имена настроек относятся к какому провайдеру. Коллега, который видит PROXY_URL и SESSION_ID, должен понимать, обязательны эти значения или нет. Для более широкого взгляда на инструменты конфиденциальности, которые соседствуют со Scrapy, страница гиды по VPN, прокси и приватности поможет связать элементы, не смешивая кодовые пути. Scrapy по-прежнему нужна своя логика прокси.

И еще один момент по реализации: проверьте внедрение секретов на тестовом аккаунте прокси, прежде чем запускать production-обход. Если тестовый аккаунт не проходит, вы поймаете ошибку в безопасном месте. Если проходит, вы знаете, что путь учетных данных прокси настроен правильно. Тогда реальный обход стартует с меньшим числом сюрпризов.

Приватный VPN и прокси от s4m

WireGuard VPN, SOCKS5/HTTP прокси и выделенные IP. Без логов, RAM-first.

Смотреть тарифы