Socks5Proxy

Настройка прокси в Selenium: подключение SOCKS5 и HTTP-прокси в Chrome и Firefox

Это руководство объясняет, как подключить HTTP- и SOCKS5-прокси Socks5Proxy в Selenium 4 для Chrome и Firefox, и как использовать IP-авторизацию, так как аргументы запуска Chrome не принимают пароль прокси.

Почему сложно настроить аутентификацию прокси в Selenium?

Chrome принимает адрес прокси через аргумент --proxy-server, но не поддерживает логин и пароль внутри адреса. Если подключиться к прокси с аутентификацией, браузер покажет окно ввода данных, которое сложно заполнить через Selenium.

Самое простое решение - авторизация по IP. Зарегистрируйте IPv4 сервера или ПК, где запускается Selenium, и прокси будет принимать подключения без логина и пароля. В Chrome достаточно указать ip:port. Можно зарегистрировать до 10 IP для работы с нескольких серверов.

Пример использует IP 198.51.100.23, HTTP-порт 8000, SOCKS5-порт 1080.

pip install selenium

Как подключить HTTP-прокси в Chrome?

После регистрации IP укажите адрес через аргумент --proxy-server в ChromeOptions. Selenium 4.6+ автоматически загружает нужный chromedriver через Selenium Manager.

Те же параметры применяются и в headless-режиме. Для проверки подключения откройте страницу проверки IP и убедитесь, что отображается IP вашего прокси.

from selenium import webdriver
from selenium.webdriver.common.by import By

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # this machine's IP is authorized in the dashboard
opts.add_argument("--headless=new")

driver = webdriver.Chrome(options=opts)
try:
    driver.get("https://api.ipify.org")
    print(driver.find_element(By.TAG_NAME, "body").text)  # should print the proxy IP
finally:
    driver.quit()

Как использовать SOCKS5-прокси в Chrome?

Вставьте адрес socks5:// в --proxy-server. Chrome использует SOCKS5 для разрешения доменных имен через прокси, но в некоторых средах внутренний DNS-запрос может оставаться. Часто используется метод блокировки локального разрешения имен с помощью аргумента --host-resolver-rules.

Для SOCKS5 также доступна IP-авторизация, так как Chrome не поддерживает аутентификацию по логину и паролю для SOCKS-прокси.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=socks5://198.51.100.23:1080")
# make sure host names are resolved through the proxy
opts.add_argument('--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE 198.51.100.23')

driver = webdriver.Chrome(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Как подключиться через Firefox?

Firefox настраивает прокси через параметры. Установите network.proxy.type в 1 (ручной), укажите адрес и порт HTTP/SOCKS. Для SOCKS5 задайте network.proxy.socks_version=5 и network.proxy.socks_remote_dns=true, чтобы DNS-запросы шли через прокси.

Firefox также не поддерживает передачу пароля прокси через параметры запуска - проще использовать авторизацию по IP.

from selenium import webdriver

opts = webdriver.FirefoxOptions()
opts.set_preference("network.proxy.type", 1)
opts.set_preference("network.proxy.socks", "198.51.100.23")
opts.set_preference("network.proxy.socks_port", 1080)
opts.set_preference("network.proxy.socks_version", 5)
opts.set_preference("network.proxy.socks_remote_dns", True)

driver = webdriver.Firefox(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Как одновременно запустить несколько браузеров с разными IP?

Запустите браузеры с разными прокси-адресами. В примере ниже API получает список ip:port и открывает 3 браузера с разными IP. Учитывайте, что один браузер потребляет много памяти - выбирайте количество одновременных запусков в зависимости от сервера.

Для длительных задач, таких как работа в браузере, рекомендуется зафиксировать один IP на один браузер и не менять его до завершения задачи.

import requests
from selenium import webdriver

KEY = "YOUR_API_KEY"
lines = requests.get(
    "https://socks5proxy.io/api/v1/proxies/download",
    params={"format": "ip:port", "protocol": "http"},
    headers={"Authorization": "Bearer " + KEY},
    timeout=30,
).text.split()

drivers = []
for line in lines[:3]:
    opts = webdriver.ChromeOptions()
    opts.add_argument("--headless=new")
    opts.add_argument("--proxy-server=http://" + line)
    drivers.append(webdriver.Chrome(options=opts))

for d in drivers:
    d.get("https://api.ipify.org")
    print(d.page_source)
    d.quit()

Что делать, если обязательно нужно использовать имя пользователя и пароль?

Если IP вашего сервера меняется, есть два решения: 1) использовать библиотеки типа selenium-wire для автоматической аутентификации, 2) запустить локальный прокси-сервер без аутентификации, который будет перенаправлять запросы в Socks5Proxy с логином/паролем.

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

Какие настройки нужны для адаптации браузера под конкретную страну?

Измените параметры --lang и Accept-Language в Chrome в соответствии со страной IP - страница откроется на нужном языке. Для сайтов с критичной временной зоной используйте CDP-команду Emulation.setTimezoneOverride.

Размер окна задается аргументом --window-size, а для эмуляции мобильного устройства используйте соответствующие настройки. Сохраняя эти параметры в наборах для разных стран, вы можете проводить тесты в одинаковых условиях.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")
opts.add_argument("--lang=de-DE")
opts.add_argument("--window-size=1366,900")

driver = webdriver.Chrome(options=opts)
driver.execute_cdp_cmd("Emulation.setTimezoneOverride", {"timezoneId": "Europe/Berlin"})
driver.get("https://example.com/")
driver.quit()

Применяются ли те же настройки для Selenium Grid или удаленного браузера?

Да. ChromeOptions и FirefoxOptions передаются и при удаленном запуске. Если добавить те же параметры в webdriver.Remote, браузер на узле Grid подключится через этот прокси. В этом случае IP для авторизации - это исходящий IP узла Grid, а не компьютера, с которого запускается код.

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

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # authorize the Grid node IP, not this machine
driver = webdriver.Remote(command_executor="http://grid.example.internal:4444", options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Что проверять, если нет подключения?

ERR_PROXY_CONNECTION_FAILED часто возникает из-за неверного адреса или порта. Убедитесь, что не используете SOCKS5-порт для HTTP-адреса. Если появляется ERR_TUNNEL_CONNECTION_FAILED или запрос аутентификации, возможно, IP для авторизации не совпадает с реальным. Проверьте исходящий IP через api.ipify.org без прокси и добавьте его в список разрешенных.

Облачные серверы могут менять исходящий IP при перезапуске. Используйте фиксированные IP или обновляйте список регистрации на панели управления при изменении IP.

Настройка прокси в Selenium: подключение Chrome и Firefox | Socks5Proxy