Что такое прокси в Selenium и когда он нужен?
Прокси в Selenium встаёт между автоматизированным браузером и сайтом, который он посещает. Браузер отправляет запрос через прокси-сервер вместо прямого соединения, поэтому целевой сайт видит IP-адрес прокси, а не ваш. В этом и заключается весь механизм. Всё остальное — ротация, авторизация, геолокация — строится уже поверх этой базовой идеи.
Веб-скрапинг — самый очевидный случай использования. Собирайте данные с товарных страниц интернет-магазина в большом объёме с одного IP — и вас заблокируют в считанные минуты, а иногда и быстрее. Пропустите те же запросы через пул ротируемых прокси, и сайту будет гораздо сложнее понять, что это один и тот же клиент, обратившийся тысячу раз.
Тестирование геолокации — другой распространённый сценарий. Стриминговая платформа, страница с ценами или локализованная рекламная кампания часто отображаются по-разному в зависимости от страны посетителя. Направьте Selenium через прокси, расположенный в Германии, затем через прокси в Бразилии, и сравните, что реально загружается, и qA-команды делают это постоянно для контента с региональными ограничениями.
Компании, занимающиеся верификацией рекламы, используют тот же приём, чтобы проверить, корректно ли отображаются объявления в разных регионах и не запускают ли конкуренты кампании, которые им не положены. Тестирование anti-bot систем работает в обратную сторону: команды безопасности прогоняют Selenium через различные типы прокси именно для того, чтобы проверить, насколько хорошо их собственные системы детекции распознают автоматизированный трафик.
Не каждому проекту на Selenium нужен прокси. Простому набору внутренних тестов, обращающемуся к вашему собственному staging-серверу, он не нужен. Скраперу, который раз в день забирает данные с трёх сайтов и запускается один раз, он тоже, скорее всего, не понадобится. Всё зависит от объёма запросов, чувствительности целевого ресурса и того, играет ли блокировка по IP какую-либо роль в вашем проекте [нужно уточнить, если позже появится статистика использования].
Пошаговая инструкция: настройка базового HTTP/HTTPS-прокси в Selenium
Настройка немного отличается между Python и Java, но идея одна и та же: прокси настраивается в объекте options браузера ещё до запуска драйвера, и после того как драйвер запущен, поменять прокси на ходу нельзя — придётся закрыть сессию и открыть новую. Если вы ищете быстрый ответ на вопрос, как настроить прокси в Selenium, вот он в двух словах: сначала создаём объект Proxy или Options, а затем передаём его в конструктор драйвера до того, как что-либо ещё произойдёт.
Python: Chrome и Firefox
- Установите Selenium. Выполните в терминале pip install selenium. Рекомендуется версия 4.x — у неё более удобный API для Options.
- Импортируйте нужные классы: from selenium import webdriver и from selenium.webdriver.chrome.options import Options.
- Создайте объект Options и добавьте аргумент с прокси напрямую — что-то вроде options.add_argument для строки --proxy-server=http://198.51.100.10:8080. Это самый быстрый способ подключить обычный HTTP-прокси без авторизации.
- Либо соберите объект Proxy из selenium.webdriver.common.proxy, установите proxy_type в MANUAL, задайте http_proxy и ssl_proxy, а затем присвойте его через options.proxy = этот объект. Такой способ хорошо подходит, когда нужен более точный контроль — например, разные прокси для HTTP- и HTTPS-трафика.
- Передайте объект options в webdriver.Chrome(options=options) или webdriver.Firefox(options=options) — в зависимости от браузера.
- Запустите драйвер и перейдите на страницу, которая показывает ваш IP, например сервис проверки IP, чтобы убедиться, что прокси действительно применился. Пропуск этого шага — самая частая причина, по которой люди думают, что прокси «не работает», хотя на самом деле он просто никогда не проверялся.
- Оберните драйвер в блок try/finally и вызовите driver.quit() после завершения работы, чтобы процесс браузера не оставался запущенным и не держал соединение через прокси в фоне.
Если же нужен именно прокси с авторизацией selenium python — то есть прокси-сервер, требующий имя пользователя и пароль, — базовый аргумент --proxy-server, описанный выше, не подойдёт напрямую, и потребуется один из способов из следующего раздела.
Java: та же логика, другой синтаксис
В Java используются те же пять идей, но синтаксис более многословный. Вы создаёте объект Proxy, вызываете setHttpProxy и setSslProxy с адресом и портом, а затем прикрепляете этот Proxy к экземпляру ChromeOptions через setCapability с ключом CapabilityType.PROXY. Далее — System.setProperty для указания пути к драйверу, создание ChromeDriver с этими options, и обычная навигация по страницам. По сути, вся selenium proxy настройка selenium java сводится именно к этой цепочке: Proxy → ChromeOptions → ChromeDriver, выполненной строго в таком порядке.
Одна деталь особенно часто сбивает с толку в Java: забывают импортировать org.openqa.selenium.Proxy и по ошибке импортируют java.net.Proxy, у которого совершенно другой API, что приводит к непонятным ошибкам типов. Мелочь, но первый раз она отнимает добрых десять минут.
Работа с прокси, требующими авторизации (логин и пароль)
Аргументы --proxy-server в свободной форме не поддерживают имя пользователя и пароль напрямую, и chrome покажет диалог авторизации, с которым Selenium не может взаимодействовать напрямую, и скрипт просто зависает. Авторизация прокси в Selenium — это именно то место, где чаще всего застревают новички, и с этим стоит разобраться по-настоящему, а не подпирать проблему временными решениями.
Самый чистый способ — собрать на лету небольшое расширение для Chrome, которое перехватывает событие onAuthRequired и автоматически подставляет учётные данные. Звучит сложнее, чем есть на деле: файл manifest.json плюс фоновый скрипт строк на пятнадцать, всё это упаковывается в файл .crx и загружается через options.add_extension(). Несколько open-source библиотек-помощников оборачивают этот паттерн, так что писать его с нуля каждый раз не нужно.
Интеграция Selenium 4 с Chrome DevTools Protocol предлагает более прямую альтернативу — Network.setExtraHTTPHeaders или более новый домен Fetch позволяют внедрить заголовок Proxy-Authorization ещё до отправки запроса. Это требует немного больше настройки, чем трюк с расширением, но полностью избавляет от этапа упаковки расширения, что некоторые команды предпочитают для CI-пайплайнов, где создание временных файлов кажется лишней головной болью.
Для более глубокого сравнения методов авторизации по типам прокси — не только в Selenium, но и в автоматизации в целом — руководство о лучших практиках авторизации прокси подробно разбирает авторизацию через заголовки, whitelisting по IP и ротацию учётных данных — с большей глубиной, чем позволяет формат этой статьи.
SOCKS5-прокси в Selenium
SOCKS5 работает иначе, чем HTTP-прокси, на уровне протокола — он не анализирует и не изменяет трафик, а просто туннелирует его, что делает его быстрее для некоторых задач, но чуть сложнее в настройке авторизации. Selenium поддерживает SOCKS5 через тот же объект Proxy — просто замените http_proxy на socks_proxy и укажите socks_version равным 5. Настройка SOCKS5-прокси в Selenium на Python почти идентична описанному выше HTTP-варианту, за исключением этой замены поля и флага версии.
Старые версии Chrome обрабатывали DNS-резолвинг для SOCKS5 локально, а не через прокси, из-за чего реальные DNS-запросы иногда «утекали» за пределы туннеля. Современные сборки Chrome по умолчанию резолвят DNS через прокси при использовании флага --proxy-server с префиксом socks5://, но если утечка DNS критична для вашего проекта, это стоит проверить отдельно.
Python-разработчикам, работающим за пределами Selenium — например, создающим самостоятельный скрапер или API-клиент, — часто нужна та же настройка SOCKS5, но без накладных расходов на браузер. Руководство по настройке SOCKS5-прокси в Python разбирает этот сценарий шаг за шагом, включая настройку на уровне сокетов, применимую независимо от того, используется браузер или нет.
Ротация прокси и управление сессиями
Один статический прокси решает проблему «скрыть мой IP», но не проблему «не попасть под ограничение частоты запросов». Ротируемые прокси меняют IP-адрес по расписанию — на каждый запрос, каждые несколько минут или при каждой новой сессии, в зависимости от настроек провайдера.
В Selenium ротация почти всегда означает перезапуск драйвера с новым объектом Proxy, а не попытку сменить прокси на ходу. Некоторые команды пишут небольшую функцию-обёртку, которая создаёт новый экземпляр драйвера, назначает следующий прокси из очереди, выполняет задачу и затем закрывает драйвер, и не самое элегантное решение, но надёжное, а надёжность важнее элегантности, когда скрипт работает без присмотра всю ночь.
Сохранение сессии усложняет ротацию. Если сайт устанавливает cookie авторизации, привязанный к конкретному IP, ротация прокси
может привести к повторной проверке или даже к блокировке. Поэтому при работе с такими сайтами лучше заранее планировать жизненный цикл сессии: завершать авторизацию, выполнять нужные действия в пределах одного IP и только затем переключаться на следующий прокси.
Практические рекомендации
- Используйте один и тот же тип прокси для всей цепочки запросов, чтобы избежать неожиданных расхождений в поведении.
- Проверяйте работу прокси до запуска основного сценария: это экономит время и помогает быстрее найти неверные данные авторизации.
- Не храните логины и пароли в коде — лучше передавать их через переменные окружения или защищённое хранилище.
- Если сайт чувствителен к смене IP, уменьшайте частоту ротации и не переключайте прокси без необходимости.
В итоге прокси в Selenium — это не просто способ скрыть адрес, а инструмент управления стабильностью, доступом и анонимностью. Если заранее учесть тип прокси, способ авторизации и особенности ротации, автоматизация будет работать заметно надёжнее.