Прокси в Selenium WebDriver: Python и Chrome
Selenium WebDriver — классический инструмент UI-автоматизации и E2E-тестов. В связке с Python и Chrome он покрывает сценарии от регрессионных тестов до сбора данных с JS-heavy страниц. Прокси направляет трафик драйвера через внешний IP NEONPROXY. Ниже — рабочие рецепты для HTTPS- и SOCKS5-прокси с авторизацией. Применяйте их только в рамках robots.txt и Terms of Service целевых ресурсов.
HTTP-прокси через ChromeOptions
Базовая настройка без логина — один аргумент --proxy-server:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
PROXY = "123.45.67.89:8080"
options = Options()
options.add_argument(f"--proxy-server=http://{PROXY}")
driver = webdriver.Chrome(options=options)
driver.get("https://api.ipify.org?format=json")
print(driver.page_source)
driver.quit()
Для прокси с логином и паролем Chrome не принимает credentials в аргументе — нужен ZIP-расширение или selenium-wire.
Авторизация через расширение Chrome
Универсальный способ для NEONPROXY — сгенерировать минимальное расширение on-the-fly:
import zipfile
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def create_proxy_extension(host, port, user, password):
manifest = """
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Proxy Auth",
"permissions": ["proxy", "tabs", "unlimitedStorage", "storage",
"webRequest", "webRequestBlocking", "<all_urls>"],
"background": {"scripts": ["background.js"]}
}
"""
background = """
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: "%s",
port: parseInt(%s)
},
bypassList: ["localhost"]
}
};
chrome.proxy.settings.set({value: config, scope: "regular"}, function(){});
chrome.webRequest.onAuthRequired.addListener(
function(details) {
return {authCredentials: {username: "%s", password: "%s"}};
},
{urls: ["<all_urls>"]},
["blocking"]
);
""" % (host, port, user, password)
plugin_path = "proxy_auth_plugin.zip"
with zipfile.ZipFile(plugin_path, "w") as zp:
zp.writestr("manifest.json", manifest)
zp.writestr("background.js", background)
return plugin_path
options = Options()
options.add_extension(create_proxy_extension(
"123.45.67.89", "8080", "login", "password"
))
driver = webdriver.Chrome(options=options)
SOCKS5 через selenium-wire (альтернатива)
Пакет selenium-wire упрощает SOCKS5 и HTTP auth без расширений:
from seleniumwire import webdriver
options = {"proxy": {
"http": "socks5://login:password@123.45.67.89:1080",
"https": "socks5://login:password@123.45.67.89:1080",
"no_proxy": "localhost,127.0.0.1"
}}
driver = webdriver.Chrome(seleniumwire_options=options)
driver.get("https://example.com")
Подробнее о протоколах — SOCKS5 vs HTTPS.
Ротация пула
Для парсинга создавайте новый driver на каждый прокси и закрывайте его после задачи. Стратегии — в гайде по ротации:
proxies = ["1.2.3.4:8080", "5.6.7.8:8080"]
for proxy in proxies:
options = Options()
options.add_argument(f"--proxy-server=http://{proxy}")
driver = webdriver.Chrome(options=options)
try:
driver.get("https://example.com")
# ... сбор данных ...
finally:
driver.quit()
Отладка и проверка IP
Если страница не грузится — проверьте прокси в чекере и сверьте IP через «Мой IP». Типичные ошибки: неверный порт, истёкший срок аренды, блокировка headless Chrome на стороне сайта (не прокси).
Для простых HTTP-запросов без браузера используйте requests — быстрее и легче Selenium.
Headless и стабильность
Добавьте options.add_argument("--headless=new") для серверных воркеров. Закрепляйте версию ChromeDriver через webdriver-manager. Список прокси подгружайте из API NEONPROXY.
Выбор IPv4 vs IPv6 — в как выбрать прокси. Сравнение с Playwright — отдельная статья. Заказ — здесь.