Що таке проксі в Selenium і коли він потрібен?

Проксі в Selenium розташовується між вашим автоматизованим браузером і сайтом, який він відвідує. Браузер надсилає запит через проксі-сервер замість того, щоб підключатися напряму, тож цільовий сайт бачить IP-адресу проксі, а не вашу. Це весь механізм. Усе інше — ротація, автентифікація, геолокація — будується поверх цього.

Веб-скрапінг — очевидний випадок використання. Спробуйте зібрати сторінки товарів рітейлера в промислових масштабах з однієї IP-адреси — і вас заблокують за лічені хвилини, а то й швидше. Пропустіть ті самі запити через пул проксі, що ротуються, і сайту буде складно зрозуміти, що це той самий клієнт звертається до нього тисячу разів поспіль. Саме тому проксі для веб-скрапінгу python настільки часто згадуються в парі — більшість скраперів пишуться саме на цій мові, і без надійного пулу проксі промисловий збір даних просто не масштабується.

Тестування геолокації — ще один варіант. Стрімінгова платформа, сторінка з цінами чи локалізована рекламна кампанія часто відображаються по-різному залежно від країни відвідувача. Спрямуйте Selenium через проксі, розташований у Німеччині, потім у Бразилії, і порівняйте, що фактично завантажується. QA-команди роблять це постійно для контенту з регіональними обмеженнями.

Компанії з перевірки реклами використовують той самий трюк, щоб з'ясувати, чи коректно відображається реклама в різних регіонах і чи не запускають конкуренти кампанії, які їм не належить запускати. Тестування анти-бот систем перевертає цю логіку навпаки: команди безпеки прогонять Selenium через різні типи проксі саме для того, щоб перевірити, наскільки добре їхні власні системи виявлення розпізнають автоматизований трафік.

Не кожному проєкту на Selenium потрібен проксі. Простому внутрішньому набору тестів, що звертається до вашого власного стейджинг-сервера, він не потрібен. Скраперу, який раз на день витягує дані з трьох сайтів і запускається одноразово, теж, імовірно, не потрібен. Усе залежить від обсягу, чутливості цільового ресурсу та від того, чи взагалі блокування за IP є фактором для вашого проєкту [перевірити, чи буде додано будь-яку статистику використання пізніше].

Покроково: налаштування базового HTTP/HTTPS-проксі в Selenium

Налаштування трохи відрізняється між Python і Java, але базова ідея однакова: налаштуйте проксі в об'єкті параметрів браузера ще до запуску драйвера. Після того як драйвер уже запущено, змінити проксі посеред сесії не вийде — доведеться закрити його й запустити новий. Якщо вам потрібна швидка відповідь на питання, як налаштувати проксі в Selenium, коротко це виглядає так: спочатку створіть об'єкт Proxy або Options, а потім передайте його в конструктор драйвера ще до того, як щось інше відбудеться.

Python: Chrome і Firefox

  1. Встановіть Selenium. Виконайте pip install selenium у терміналі. Рекомендована версія 4.x через простіший API Options.
  2. Імпортуйте потрібні класи: from selenium import webdriver і from selenium.webdriver.chrome.options import Options.
  3. Створіть об'єкт Options і додайте аргумент проксі напряму, приблизно так: options.add_argument для рядка --proxy-server=http://198.51.100.10:8080. Це найшвидший спосіб для звичайного HTTP-проксі без автентифікації.
  4. Альтернативно, створіть об'єкт Proxy з selenium.webdriver.common.proxy, встановіть proxy_type як MANUAL, призначте http_proxy і ssl_proxy, а потім прикріпіть його через options.proxy дорівнює цьому об'єкту. Цей спосіб добре підходить, коли потрібен тонший контроль, наприклад, різні проксі для HTTP і HTTPS трафіку.
  5. Передайте об'єкт options у webdriver.Chrome(options=options) або webdriver.Firefox(options=options) залежно від браузера.
  6. Запустіть драйвер і перейдіть на сторінку, яка показує вашу IP-адресу, наприклад сервіс перевірки IP, щоб переконатися, що проксі справді працює. Пропуск цього кроку — найпоширеніша причина, чому люди думають, що їхній проксі "не працює", хоча насправді працює — просто вони ніколи це не перевіряли.
  7. Обгорніть драйвер у блок try/finally і викличте driver.quit() після завершення роботи, щоб процес браузера не залишався висіти й не тримав з'єднання проксі відкритим у фоновому режимі.

Java: та сама логіка, інший синтаксис

Java дотримується тих самих п'яти ідей, але з більш багатослівним синтаксисом. Ви створюєте об'єкт Proxy, викликаєте setHttpProxy і setSslProxy з адресою та портом, а потім прикріплюєте цей Proxy до екземпляра ChromeOptions за допомогою setCapability з ключем CapabilityType.PROXY. Далі — System.setProperty для шляху до драйвера, створення екземпляра ChromeDriver з опціями і навігація як зазвичай.

Одна деталь, на якій спотикаються саме в Java: забути імпортувати org.openqa.selenium.Proxy й натомість випадково імпортувати java.net.Proxy, який має зовсім інший API і викидає незрозумілі помилки типів. Дрібниця, але коштує добрих десять хвилин, коли трапляється вперше.

Робота з проксі, що вимагають автентифікації (логін і пароль)

Аргументи --proxy-server у вільній формі не підтримують ім'я користувача та пароль нативно. Chrome відкриє діалогове вікно входу, з яким Selenium не може взаємодіяти напряму, і ваш скрипт просто зависає. Автентифікація проксі в Selenium — це те, на чому застряють більшість новачків, і варто вирішувати це правильно, а не обходити проблему. Якщо коротко: налаштувати selenium проксі з авторизацією "з коробки" через самий лише аргумент командного рядка не вийде, тут потрібен додатковий крок.

Найчистіше рішення — створити на льоту невелике розширення Chrome, яке перехоплює подію onAuthRequired і автоматично підставляє облікові дані. Звучить складніше, ніж є насправді: файл manifest.json плюс фоновий скрипт рядків на п'ятнадцять, запаковані у файл .crx, а потім завантажені через options.add_extension(). Кілька open-source бібліотек-помічників уже реалізують цей патерн, тож не доведеться писати його з нуля щоразу.

Інтеграція Chrome DevTools Protocol у Selenium 4 пропонує прямішу альтернативу — Network.setExtraHTTPHeaders або новіший домен Fetch можуть додати заголовок Proxy-Authorization перед відправленням запитів. Це вимагає трохи більше налаштувань, ніж трюк із розширенням, зате повністю уникає етапу пакування розширення, що деякі команди воліють мати в CI-пайплайнах, де створення тимчасових файлів здається незручним.

Детальніше порівняння методів автентифікації для різних типів проксі — не лише в Selenium, а й у автоматизації загалом — можна знайти в гіді з найкращих практик автентифікації проксі, де докладніше розглянуто автентифікацію через заголовки, білі списки IP та ротацію облікових даних.

Проксі SOCKS5 у Selenium

SOCKS5 працює інакше, ніж HTTP-проксі, на рівні протоколу — він не перевіряє й не змінює трафік, а лише тунелює його, що робить його швидшим для деяких навантажень і трохи складнішим для автентифікації. Selenium підтримує SOCKS5 через той самий об'єкт Proxy — просто замініть http_proxy на socks_proxy і встановіть socks_version у 5. Налаштування SOCKS5-проксі в Selenium Python майже ідентичне описаному вище процесу для HTTP, за винятком цієї заміни поля та прапорця версії.

Зауважте, що старіші версії Chrome обробляли DNS-розпізнавання для SOCKS5 локально, а не через проксі, що інколи призводило до витоку реальних DNS-запитів поза тунелем. Нові збірки Chrome за замовчуванням розпізнають DNS через проксі, якщо використовується прапорець --proxy-server з префіксом socks5://, але варто окремо перевірити це, якщо витік DNS має значення для вашого проєкту.

Python-розробники, що працюють поза Selenium, наприклад створюючи окремий скрапер чи API-клієнт, часто потребують того самого налаштування SOCKS5 без накладних витрат браузера. Гід з налаштування SOCKS5-проксі для Python покроково розглядає цей сценарій, включно з налаштуванням на рівні сокетів, яке застосовується незалежно від того, задіяний браузер чи ні.

Ротація проксі та керування сесіями

Один статичний проксі вирішує проблему "приховати мою IP-адресу", але не проблему "уникнути обмеження частоти запитів". Проксі з ротацією змінюють IP-адресу за розкладом — щозапиту, кожні кілька хвилин або з кожною новою сесією, залежно від налаштувань провайдера.

У Selenium ротація майже завжди означає перезапуск драйвера з новим об'єктом Proxy, а не спробу змінити проксі посеред сесії. Деякі команди створюють невелику функцію-обгортку, яка запускає новий екземпляр драйвера, призначає наступний проксі з черги, виконує завдання, а потім знищує драйвер. Це не елегантно, зате надійно, а надійність важливіша за елегантність, коли скрипт працює без нагляду цілу ніч.

Збереження стану сесії ускладнює ротацію. Якщо сайт встановлює cookie для входу, прив'язаний до конкретної IP-адреси, ротація проксі

може викликати повторну перевірку або навіть тимчасове блокування. Тому перед ротацією варто чітко розділити сценарії: де потрібен стабільний канал, а де важливіша анонімність або обхід лімітів. У практиці це часто означає окремі профілі для входу, окремі проксі для збору даних і окрему логіку повторних спроб.

Типові помилки під час роботи з проксі

  • Вказувати проксі лише в браузері, але не враховувати DNS- або TLS-поведінку системи.
  • Забувати про аутентифікацію, коли провайдер вимагає логін і пароль.
  • Очікувати, що зміна проксі в уже запущеній сесії Selenium спрацює без перезапуску.
  • Використовувати один і той самий IP для всіх завдань, а потім дивуватися блокуванням.
  • Не перевіряти, чи дійсно сайт бачить нову IP-адресу після налаштування.

Підсумок простий: проксі в Selenium — це не лише про приховування IP, а й про контроль стабільності, сесій та поведінки автоматизації. Якщо підійти до налаштування обережно, можна значно підвищити надійність скриптів у Python і Java.