Selenium WebDriver — один из самых популярных инструментов для автоматизации браузера и парсинга данных. При работе с большими объёмами запросов или при необходимости обхода географических ограничений критически важно правильно настроить прокси. В этом руководстве разберём все способы интеграции прокси в Selenium для разных браузеров и языков программирования, а также решим типичные проблемы, с которыми сталкиваются разработчики.
Зачем нужны прокси в Selenium
При автоматизации веб-скрапинга или тестирования через Selenium возникает несколько задач, которые невозможно решить без прокси:
- Обход rate limiting — многие сайты ограничивают количество запросов с одного IP-адреса. Без прокси ваш скрипт быстро получит блокировку после 50-100 запросов.
- Географические ограничения — если нужно парсить контент, доступный только из определённой страны, прокси с IP нужной геолокации решает эту задачу.
- Распределение нагрузки — при массовом парсинге данных ротация IP-адресов через прокси позволяет распределить запросы и избежать детектирования ботов.
- Тестирование локализации — для проверки, как сайт отображается пользователям из разных стран, необходимы прокси соответствующих регионов.
- Обход антибот-систем — современные защиты (Cloudflare, DataDome) анализируют IP-репутацию. Качественные прокси помогают выглядеть как обычный пользователь.
Без правильной настройки прокси ваш Selenium-скрипт будет работать нестабильно: получать капчи, временные баны или полную блокировку доступа. Особенно это критично при парсинге e-commerce площадок, социальных сетей или сайтов с агрессивной защитой от ботов.
Какие типы прокси использовать
Выбор типа прокси зависит от задачи. Для Selenium-автоматизации используются три основных типа прокси, каждый со своими преимуществами:
| Тип прокси | Скорость | Анонимность | Лучшие сценарии |
|---|---|---|---|
| Прокси дата-центров | Очень высокая (100+ Мбит/с) | Средняя | Парсинг публичных данных, тестирование производительности, массовые проверки |
| Резидентные прокси | Средняя (10-50 Мбит/с) | Очень высокая | Обход антибот-систем, парсинг соцсетей, e-commerce, сайтов с жёсткой защитой |
| Мобильные прокси | Средняя (5-30 Мбит/с) | Максимальная | Работа с мобильными версиями сайтов, соцсети, приложения с проверкой мобильных IP |
Рекомендации по выбору:
- Для парсинга новостных сайтов, открытых API, простых каталогов — подойдут прокси дата-центров. Они дешевле и быстрее.
- Для работы с Amazon, eBay, Google, социальными сетями — только резидентные прокси. Эти платформы активно блокируют IP дата-центров.
- Для эмуляции мобильных пользователей или работы с Instagram, TikTok — мобильные прокси незаменимы.
- Для тестирования геолокации — выбирайте прокси с возможностью выбора конкретной страны и города.
Настройка прокси для Chrome в Selenium
Chrome WebDriver — наиболее популярный выбор для Selenium-автоматизации. Настройка прокси выполняется через объект ChromeOptions. Рассмотрим несколько способов.
Способ 1: HTTP/HTTPS прокси без авторизации (Python)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Настройка прокси
PROXY = "123.45.67.89:8080" # Замените на ваш прокси-сервер
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{PROXY}')
# Дополнительные опции для стабильности
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
# Запуск драйвера
driver = webdriver.Chrome(options=chrome_options)
# Проверка IP
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Способ 2: SOCKS5 прокси (Python)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
PROXY = "123.45.67.89:1080"
chrome_options = Options()
# Для SOCKS5 указываем протокол явно
chrome_options.add_argument(f'--proxy-server=socks5://{PROXY}')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Важно: Chrome поддерживает HTTP, HTTPS и SOCKS5 прокси. Для SOCKS4 потребуются дополнительные настройки или использование расширений.
Настройка прокси для Chrome в Java
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.Proxy;
public class ChromeProxyExample {
public static void main(String[] args) {
// Настройка прокси
Proxy proxy = new Proxy();
proxy.setHttpProxy("123.45.67.89:8080");
proxy.setSslProxy("123.45.67.89:8080");
ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);
options.addArguments("--no-sandbox");
WebDriver driver = new ChromeDriver(options);
driver.get("https://httpbin.org/ip");
System.out.println(driver.getPageSource());
driver.quit();
}
}
Настройка прокси для Firefox в Selenium
Firefox WebDriver использует другой подход к настройке прокси через профиль браузера. Это даёт больше гибкости, но требует понимания параметров конфигурации.
HTTP/HTTPS прокси для Firefox (Python)
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
firefox_options = Options()
# Настройка прокси через preferences
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)
# Отключение прокси для локальных адресов
firefox_options.set_preference("network.proxy.no_proxies_on", "localhost,127.0.0.1")
driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
SOCKS5 прокси для Firefox (Python)
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
PROXY_HOST = "123.45.67.89"
PROXY_PORT = 1080
firefox_options = Options()
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.socks", PROXY_HOST)
firefox_options.set_preference("network.proxy.socks_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.socks_version", 5)
# Для SOCKS5 с DNS через прокси
firefox_options.set_preference("network.proxy.socks_remote_dns", True)
driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Преимущество Firefox: параметр network.proxy.socks_remote_dns позволяет выполнять DNS-запросы через прокси, что повышает анонимность и помогает обходить блокировки на уровне DNS.
Работа с прокси, требующими авторизацию
Большинство качественных прокси-сервисов используют авторизацию по логину и паролю. Selenium не поддерживает передачу credentials напрямую в URL прокси для Chrome, поэтому требуются обходные решения.
Способ 1: Chrome Extension для авторизации (рекомендуемый)
Создаём временное расширение Chrome, которое автоматически подставляет логин и пароль при подключении к прокси:
import os
import zipfile
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
PROXY_USER = "username"
PROXY_PASS = "password"
# Создание манифеста расширения
manifest_json = """
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Chrome Proxy",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
}
}
"""
# Скрипт для авторизации
background_js = """
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() {});
function callbackFn(details) {
return {
authCredentials: {
username: "%s",
password: "%s"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: [""]},
['blocking']
);
""" % (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS)
# Создание расширения
plugin_path = 'proxy_auth_plugin.zip'
with zipfile.ZipFile(plugin_path, 'w') as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)
# Запуск Chrome с расширением
chrome_options = Options()
chrome_options.add_extension(plugin_path)
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
os.remove(plugin_path) # Удаление временного файла
Способ 2: Firefox с авторизацией (проще)
Firefox позволяет передавать credentials через настройки профиля:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
PROXY_USER = "username"
PROXY_PASS = "password"
firefox_options = Options()
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)
# Авторизация (работает не всегда, зависит от версии Firefox)
firefox_options.set_preference("network.proxy.username", PROXY_USER)
firefox_options.set_preference("network.proxy.password", PROXY_PASS)
# Отключение запроса авторизации
firefox_options.set_preference("network.automatic-ntlm-auth.trusted-uris", PROXY_HOST)
driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Примечание: Если ваш прокси-провайдер поддерживает whitelist IP, проще добавить IP вашего сервера в белый список и использовать прокси без авторизации.
Ротация прокси в Selenium
При парсинге больших объёмов данных критически важно менять прокси, чтобы избежать блокировок. Существует два подхода: ротация на уровне кода и использование rotating прокси.
Ротация на уровне кода (создание нового драйвера)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import random
# Список прокси
PROXY_LIST = [
"123.45.67.89:8080",
"98.76.54.32:8080",
"11.22.33.44:8080",
]
def create_driver_with_proxy(proxy):
"""Создание драйвера с указанным прокси"""
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{proxy}')
chrome_options.add_argument('--no-sandbox')
return webdriver.Chrome(options=chrome_options)
# Парсинг с ротацией
urls_to_parse = [
'https://example.com/page1',
'https://example.com/page2',
'https://example.com/page3',
]
for url in urls_to_parse:
# Выбираем случайный прокси
current_proxy = random.choice(PROXY_LIST)
# Создаём новый драйвер с прокси
driver = create_driver_with_proxy(current_proxy)
try:
driver.get(url)
# Ваша логика парсинга
print(f"Parsed {url} via {current_proxy}")
print(driver.title)
except Exception as e:
print(f"Error with {current_proxy}: {e}")
finally:
driver.quit() # Важно закрывать драйвер
Использование rotating прокси (проще)
Многие прокси-провайдеры предоставляют rotating endpoint — один URL, который автоматически меняет IP при каждом запросе или через определённые интервалы. Это упрощает код:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Rotating прокси endpoint (IP меняется автоматически)
ROTATING_PROXY = "rotating.proxycove.com:8080"
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{ROTATING_PROXY}')
driver = webdriver.Chrome(options=chrome_options)
# Каждый запрос будет с нового IP
urls = ['https://httpbin.org/ip'] * 5
for url in urls:
driver.get(url)
print(driver.find_element("tag name", "body").text)
# Каждый вывод покажет разный IP
driver.quit()
Рекомендация: Для больших проектов используйте rotating прокси — это экономит ресурсы (не нужно пересоздавать драйвер) и упрощает код. Резидентные прокси обычно поддерживают ротацию из коробки.
Типичные ошибки и их решение
Ошибка: "ERR_PROXY_CONNECTION_FAILED"
Причина: Selenium не может подключиться к прокси-серверу.
Решение:
- Проверьте правильность IP и порта прокси
- Убедитесь, что прокси активен (проверьте через curl:
curl -x http://123.45.67.89:8080 https://httpbin.org/ip) - Проверьте firewall — возможно, исходящие соединения к прокси заблокированы
- Если используете авторизацию, проверьте правильность логина/пароля
Ошибка: "ERR_TUNNEL_CONNECTION_FAILED"
Причина: Проблема с HTTPS-соединением через прокси.
Решение:
- Убедитесь, что прокси поддерживает HTTPS (CONNECT метод)
- Для HTTPS-сайтов используйте HTTPS прокси или SOCKS5
- Добавьте опцию игнорирования SSL-ошибок:
chrome_options.add_argument('--ignore-certificate-errors')
Ошибка: Прокси работает, но сайт детектирует бота
Причина: Сайт использует продвинутые методы детектирования (fingerprinting, анализ поведения).
Решение:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{PROXY}')
# Отключение webdriver-флага (основной признак автоматизации)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=chrome_options)
# Удаление navigator.webdriver
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': '''
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
'''
})
driver.get('https://bot.sannysoft.com/') # Сайт для проверки детектирования
Дополнительно рекомендуется использовать библиотеку undetected-chromedriver, которая автоматически применяет множество антидетект-техник.
Проблема: Медленная загрузка страниц через прокси
Причина: Прокси перегружен или находится географически далеко.
Решение:
- Выбирайте прокси ближе к целевому серверу (например, для парсинга US-сайтов используйте US-прокси)
- Используйте прокси дата-центров для задач, где скорость важнее анонимности
- Настройте таймауты в Selenium для избежания зависаний:
from selenium.webdriver.support.ui import WebDriverWait
driver.set_page_load_timeout(30) # Максимум 30 секунд на загрузку
driver.implicitly_wait(10) # Неявное ожидание элементов
Best practices при работе с прокси
1. Используйте пулы прокси
Не полагайтесь на один прокси-сервер. Создайте пул из 10-50 прокси и ротируйте их. Если один прокси забанят, парсинг продолжится с другого.
2. Добавляйте случайные задержки
Даже с прокси слишком быстрые запросы выглядят подозрительно. Добавляйте случайные задержки 2-5 секунд между запросами:
import time
import random
for url in urls:
driver.get(url)
# Парсинг...
time.sleep(random.uniform(2, 5)) # Случайная задержка 2-5 сек
3. Мониторьте качество прокси
Проверяйте прокси перед использованием. Исключайте из пула те, которые не отвечают или возвращают ошибки:
import requests
def check_proxy(proxy):
"""Проверка работоспособности прокси"""
try:
response = requests.get(
'https://httpbin.org/ip',
proxies={'http': f'http://{proxy}', 'https': f'http://{proxy}'},
timeout=10
)
return response.status_code == 200
except:
return False
# Фильтрация рабочих прокси
working_proxies = [p for p in PROXY_LIST if check_proxy(p)]
print(f"Working proxies: {len(working_proxies)}/{len(PROXY_LIST)}")
4. Используйте headless режим с осторожностью
Headless браузеры легче детектировать. Для сложных сайтов запускайте браузер в обычном режиме или используйте --window-size вместо --headless.
5. Логируйте все запросы
Сохраняйте информацию о том, какой прокси использовался для каждого запроса. Это поможет выявить проблемные прокси и отладить ошибки.
6. Соблюдайте robots.txt и rate limits
Даже с прокси уважайте правила сайта. Агрессивный парсинг может привести к блокировке целых подсетей прокси, что навредит другим пользователям.
Заключение
Правильная настройка прокси в Selenium WebDriver — это фундамент стабильного парсинга и автоматизации. Мы разобрали все основные способы интеграции прокси для Chrome и Firefox, работу с авторизацией, ротацию IP-адресов и решение типичных проблем. Главное — выбрать подходящий тип прокси под вашу задачу: для простого парсинга достаточно прокси дата-центров, а для работы с защищёнными платформами необходимы резидентные или мобильные прокси.
Помните о best practices: используйте пулы прокси, добавляйте случайные задержки, мониторьте качество соединений и применяйте антидетект-техники. Это увеличит стабильность ваших скриптов и снизит риск блокировок в десятки раз.
Если вы планируете автоматизацию парсинга с высокими требованиями к анонимности и обходу антибот-систем, рекомендуем попробовать резидентные прокси — они обеспечивают максимальную стабильность работы с любыми сайтами, включая социальные сети, e-commerce платформы и сервисы с продвинутой защитой. Для задач, где критична скорость обработки больших объёмов данных, прокси дата-центров станут оптимальным выбором по соотношению цена-производительность.