Настройка прокси в Selenium WebDriver
Подключить прокси к Selenium — одна строка: флаг Chrome или кроссбраузерный класс Proxy. Все спотыкаются о другое — об авторизацию: Chrome игнорирует логин:пароль@ в адресе прокси, а WebDriver не умеет нажимать кнопки в системном окне входа. В этом гайде — настройка на Python и Java, рабочие способы авторизации, SOCKS5 и ротация прокси по списку.
Перед настройкой: данные прокси и порты
Вам понадобятся IP-адрес прокси и порт. И то и другое есть в личном кабинете — откройте активную подписку, там указаны все данные для подключения. Порт зависит от способа авторизации:
| Авторизация | Порт HTTP | Порт SOCKS5 | Кому подходит |
|---|---|---|---|
| Привязка по IP логин и пароль не нужны |
8085 |
1085 |
Рекомендуемый вариант для Selenium — код авторизации не нужен вовсе |
| Логин / пароль данные из личного кабинета |
8080 |
1080 |
Машины с меняющимся IP — потребуется один из обходных путей ниже |
При работе с привязкой сначала добавьте IP-адрес сервера в привязку в личном кабинете. После этого прокси принимает запросы с этой машины без логина и пароля — ровно то, что нужно Selenium.
Примеры в гайде рассчитаны на Selenium 4:
Отдельно устанавливать ChromeDriver в современных версиях обычно не нужно: начиная с Selenium 4.6 в комплекте идёт Selenium Manager, который подбирает драйвер под ваш браузер автоматически.
Прокси в Chrome
Самый короткий путь — аргумент --proxy-server (тот же флаг работает в Edge и других Chromium-браузерах):
Python
Java
Python, класс Proxy
Тот же кроссбраузерный класс Proxy доступен и в Python — этот способ соответствует текущей документации Selenium по browser options:
При работе с классом Proxy заполняйте оба поля — httpProxy и sslProxy — одним и тем же адресом. sslProxy — это не другой тип прокси, а прокси для https://-адресов; почти весь современный веб — HTTPS, так что пустое поле отправит почти весь трафик мимо прокси.
Прокси в Firefox
Тот же класс Proxy работает во всех браузерах — в Python он прикрепляется к объекту options:
Авторизация прокси: что реально работает
Классическая боль Selenium: --proxy-server=http://логин:пароль@ip:8080 выглядит правильно, но не работает — Chrome игнорирует данные для входа, встроенные в адрес ручного прокси, и показывает браузерное окно HTTP-аутентификации. Это окно не является DOM-элементом страницы, поэтому find_element() и обычные действия Selenium до него не дотягиваются. Отдельных полей логина и пароля для HTTP- и HTTPS-прокси стандартная proxy capability тоже не даёт — для авторизации нужен другой механизм. Три рабочих варианта — в порядке, в котором мы бы их рекомендовали:
1. Привязка по IP (порт 8085) — авторизация не нужна вовсе. Добавьте IP машины в привязку в личном кабинете и используйте обычную настройку из секций выше. Это стандартный подход для парсинга и тестовых ферм: никаких секретов в коде, работает в любом браузере и на любом языке.
2. Java: ответ на запрос авторизации через CDP. Java-биндинг Selenium 4 умеет регистрировать данные для входа в Chromium-браузерах:
3. Python: библиотека Selenium Wire. Она пропускает трафик через локальный промежуточный прокси и выполняет авторизацию за вас:
Учтите, что Selenium Wire больше активно не поддерживается, поэтому рассматривайте его как временное решение — для долгоживущих проектов привязка по IP надёжнее.
Прокси SOCKS5
Chrome принимает SOCKS5 через тот же флаг с другой схемой, а в классе Proxy для него есть отдельные поля:
В Selenium API есть поля для SOCKS-учётных данных (socks_username и socks_password), но полагаться на них не стоит: Chromium авторизацию на SOCKS5 не поддерживает, а драйверы других браузеров реализуют эти поля непоследовательно. Для надёжной работы используйте порт 1085 с привязкой по IP. Для большинства задач в Selenium проще взять HTTP-прокси.
В мануалах по curl и Python requests встречается схема socks5h:// — там дополнительная «h» заставляет прокси резолвить доменные имена вместо вашей машины, чтобы DNS-запросы не уходили мимо прокси. Chrome такую схему не распознаёт, и она ему не нужна: по документации Chromium с обычной socks5:// резолвинг имён всегда выполняется на стороне прокси.
Загрузка прокси из списка и ротация
С пакетом прокси адреса никто не вписывает в код руками: выгрузите весь список из личного кабинета в файл — по одному IP:порт на строку, порядок полей и разделитель настраиваются при выгрузке — и загружайте его в начале скрипта. Важный нюанс: штатными средствами WebDriver и флагом --proxy-server прокси в уже запущенной сессии не меняется, поэтому самый простой и надёжный вариант ротации — новый driver на каждый адрес (смена без перезапуска возможна только через дополнительный слой: расширение, PAC-конфигурацию или локальный промежуточный прокси вроде Selenium Wire). С привязкой по IP (порт 8085) полный скрипт выглядит так:
Если список работает на портах с логином и паролем (8080/1080), задайте их один раз константами — адреса по-прежнему берутся из файла. Сам Chrome данные для входа не примет (см. раздел про авторизацию), поэтому на Python это делается через Selenium Wire:
На Java оставьте обычный цикл ротации и один раз на каждый driver регистрируйте данные для входа через HasAuthentication (способ через CDP из раздела про авторизацию). А если список выгружен уже с логином и паролем — строки вида логин:пароль@IP:порт, формат выгрузки в личном кабинете настраивается — уберите константы и подставляйте строку как есть: f"http://{line}".
Наши пакеты серверных прокси начинаются от 100 IP, так что сам список узким местом не станет, а когда целевой сайт начнёт ограничивать запросы — обновите список по запросу и выгрузите файл заново. Если перезапуск браузера на каждый IP слишком медленный для вашей задачи, ротационные прокси переворачивают логику: в Selenium остаётся один адрес шлюза, а выходной IP меняется на каждом запросе.
Обычные настройки прокси в options передаются в Selenium Grid вместе с новой сессией и работают с RemoteWebDriver без изменений. Авторизация через HasAuthentication — отдельный случай: этот интерфейс реализуют напрямую Chromium-драйверы, а не базовый RemoteWebDriver, поэтому в Grid может понадобиться Augmenter, а узел должен поддерживать доступ к CDP или WebDriver BiDi.
Если что-то не работает
Самые частые причины: ERR_TUNNEL_CONNECTION_FAILED или ERR_PROXY_CONNECTION_FAILED обычно означают, что порт не соответствует способу авторизации (см. таблицу) — либо, на портах 8085/1085, что IP машины не добавлен в привязку; окно входа при старте значит, что прокси ждёт данные, которые браузер передать не может, — перейдите на привязку или используйте один из обходных путей; а если HTTPS-сайты идут мимо прокси, хотя HTTP работает, — заполнен httpProxy, но не sslProxy. Если дело не в этом — напишите нам в онлайн-чат прямо на этой странице, поможем подключиться.