Налаштування проксі в Selenium: підключення SOCKS5 та HTTP до Chrome та Firefox
Цей посібник пояснює, як підключити HTTP- та SOCKS5-проксі Socks5Proxy при запуску Chrome та Firefox через Selenium 4, а також як використовувати IP-авторизацію, оскільки аргументи запуску Chrome не підтримують передачу паролю проксі.
Чому автентифікація проксі у Selenium є складною?
Chrome приймає адресу проксі через аргумент --proxy-server, але не підтримує логін та пароль у самій адресі. Якщо підключитися до проксі, який вимагає автентифікації, браузер покаже вікно для введення даних, але через Selenium заповнити його складно.
Найзручніше рішення - IP авторизація. Зареєструйте IPv4 сервера або ПК, де запущено Selenium, на панелі управління, і проксі прийматиме підключення з цього IP без імені користувача та пароля. У 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?
Ви можете запустити кілька браузерів з різними проксі-адресами. Наведений нижче код отримує список ip:port через API та запускає 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-авторизація недоступна (наприклад, через змінні IP), є два способи: 1) використовувати проміжні бібліотеки (наприклад, selenium-wire) для автентифікації; 2) запустити локальний проксі без автентифікації, який підключатиметься до Socks5Proxy з іменем користувача та паролем.
Обидва методи потребують додаткових компонентів для управління. Якщо можливо, використовуйте IP-авторизацію зі статичних серверів - це найпростіший і найшвидший варіант.
Як налаштувати браузер для імітації певної країни?
Змініть параметр --lang у Chrome та налаштування Accept-Language відповідно до країни 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-адрес до вузлів полегшить управління.
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. Перевірте свій IP за допомогою cURL на api.ipify.org без проксі та додайте його до списку дозволених IP.
Після перезавантаження хмарного сервера його зовнішня IP може змінитися. Використовуйте статичні IP або оновлюйте список дозволених IP у панелі керування при зміні IP.