Перейти до вмісту

Як налаштувати проксі для Selenium у Python: повний посібник

Инструменты
Як налаштувати проксі для Selenium у Python: повний посібник

Налаштування проксі для Selenium у Python вимагає передачі параметрів проксі через специфічні опції браузера або використання бібліотек проміжного ПЗ, таких як Selenium-wire, для сесій з автентифікацією. Для стандартних HTTP або SOCKS5 проксі без автентифікації найбільш ефективним методом є аргумент --proxy-server у ChromeOptions, тоді як проксі з автентифікацією часто потребують спеціальних розширень браузера або драйверів з підтримкою проксі.

Чому інтеграція проксі необхідна для автоматизації Selenium

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

Використання такого сервісу, як GProxy, забезпечує доступ до пулів резидентних та дата-центр проксі, що заважає веб-сайтам ідентифікувати трафік як такий, що надходить з одного автоматизованого джерела. Це особливо критично для:

  • Веб-скрапінгу: Обхід механізмів захисту від ботів, таких як Cloudflare або Akamai, які відстежують частоту запитів з однієї IP.
  • Тестування локалізації: Перевірка того, чи правильно сайт відображає валюту, мову та контент для користувачів у конкретних країнах.
  • Верифікації реклами: Перевірка того, чи правильно відображаються рекламні оголошення цільовій аудиторії без блокувань або перенаправлень.
  • Навантажувального тестування: Симуляція трафіку з різних географічних локацій для перевірки часу відповіді сервера та ефективності CDN.
Як налаштувати проксі для Selenium у Python: повний посібник

Базове налаштування проксі для Chrome та Firefox

Найпростіший спосіб впровадити проксі в Selenium — через нативні опції браузера. Цей метод найкраще підходить для проксі з "білим списком IP" (IP-whitelist), де проксі-провайдер (наприклад, GProxy) авторизує IP-адресу вашого сервера, усуваючи потребу в логіні та паролі в рядку підключення.

Налаштування Chrome за допомогою Options

У Chrome ви використовуєте метод add_argument. Це найшвидша реалізація, яка створює мінімальне навантаження на час запуску браузера.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

proxy_ip_port = "gw.gproxy.com:10000"

chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_ip_port}')

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://api.ipify.org?format=json")
print(driver.page_source)
driver.quit()

Налаштування Firefox за допомогою об'єкта Proxy

Firefox обробляє проксі інакше, часто використовуючи об'єкт Proxy з selenium.webdriver.common.proxy. Це дозволяє більш тонко контролювати, які протоколи (HTTP, SSL, SOCKS) використовують проксі.

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType

proxy_host = "gw.gproxy.com:10000"

proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = proxy_host
proxy.ssl_proxy = proxy_host

options = webdriver.FirefoxOptions()
options.proxy = proxy

driver = webdriver.Firefox(options=options)
driver.get("https://httpbin.org/ip")
driver.quit()

Обробка автентифікації проксі в Selenium

Стандартний Selenium не підтримує нативно проксі, що вимагають логін та пароль через аргумент --proxy-server. Якщо ви спробуєте використати http://user:pass@host:port, Chrome зазвичай ігноруватиме облікові дані або викличе нативне спливаюче вікно браузера, з яким Selenium не може легко взаємодіяти. Для вирішення цієї проблеми існують два основні професійні підходи.

Метод 1: Використання Selenium-wire

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

from seleniumwire import webdriver

# Облікові дані та ендпоінт GProxy
proxy_options = {
    'proxy': {
        'http': 'http://username:[email protected]:10000',
        'https': 'https://username:[email protected]:10000',
        'no_proxy': 'localhost,127.0.0.1'
    }
}

driver = webdriver.Chrome(seleniumwire_options=proxy_options)
driver.get("https://www.gproxy.com/check-ip")
driver.quit()

Метод 2: Підхід із кастомним розширенням

Для високонавантажених середовищ, де затримки від MITM-проксі (Man-In-The-Middle) Selenium-wire є небажаними, створення тимчасового розширення Chrome "на льоту" є галузевим стандартом. Це розширення використовує API chrome.proxy для встановлення облікових даних.

import os
import zipfile
from selenium import webdriver

def create_proxy_extension(proxy_host, proxy_port, proxy_user, proxy_pass):
    manifest_json = """
    {
        "version": "1.0.0",
        "manifest_version": 2,
        "name": "GProxy Extension",
        "permissions": [
            "proxy",
            "tabs",
            "unlimitedStorage",
            "storage",
            "<all_urls>",
            "webRequest",
            "webRequestBlocking"
        ],
        "background": {
            "scripts": ["background.js"]
        },
        "minimum_chrome_version":"22.0.0"
    }
    """

    background_js = f"""
    var config = {{
            mode: "fixed_servers",
            rules: {{
              singleProxy: {{
                scheme: "http",
                host: "{proxy_host}",
                port: parseInt({proxy_port})
              }},
              bypassList: ["localhost"]
            }}
          }};

    chrome.proxy.settings.set({{value: config, scope: "regular"}}, function() {{}});

    chrome.webRequest.onAuthRequired.addListener(
                function(details) {{
                    return {{
                        authCredentials: {{
                            username: "{proxy_user}",
                            password: "{proxy_pass}"
                        }}
                    }};
                }},
                {{urls: ["<all_urls>"]}},
                ['blocking']
    );
    """
    
    extension_path = 'proxy_auth_plugin.zip'
    with zipfile.ZipFile(extension_path, 'w') as zp:
        zp.writestr("manifest.json", manifest_json)
        zp.writestr("background.js", background_js)
    
    return extension_path

# Реалізація
proxy_ext = create_proxy_extension("gw.gproxy.com", "10000", "my_user", "my_pass")
options = webdriver.ChromeOptions()
options.add_extension(proxy_ext)
driver = webdriver.Chrome(options=options)
Як налаштувати проксі для Selenium у Python: повний посібник

Порівняння методів налаштування проксі

Вибір правильного методу залежить від ваших вимог до продуктивності, типу проксі (резидентні чи дата-центр) та необхідності частої ротації IP.

Метод Підтримка автентифікації Продуктивність Складність Найкраще для
ChromeOptions Тільки IP-Whitelist Відмінна Низька Статичні IP дата-центрів
Selenium-wire Нативна (Логін/Пароль) Середня (Накладні витрати) Низька Швидке прототипування, налагодження
Кастомне розширення Нативна (Логін/Пароль) Відмінна Висока Професійний скрапінг
GProxy Backconnect Єдиний ендпоінт Відмінна Низька Масштабна ротація IP

Просунуте керування проксі: ротація та липкі сесії

При використанні GProxy ви часто маєте вибір між ротаційними проксі та липкими сесіями (Sticky Sessions). Розуміння того, як реалізувати їх у Python, є життєво важливим для підтримки стабільності сесії під час оформлення замовлення або заповнення багатоетапних форм.

Реалізація липких сесій

Липка сесія гарантує, що всі запити, зроблені вашим екземпляром драйвера Selenium, залишатимуться на одній і тій самій IP-адресі протягом певного часу (наприклад, від 10 до 30 хвилин). У GProxy це зазвичай вирішується за допомогою ID сесії в рядку імені користувача.

# Приклад липкої сесії з використанням пулу резидентних проксі GProxy
session_id = "session_82734"
proxy_user = f"user-customer_id-session-{session_id}"
# Тепер використовуйте цей рядок користувача у конфігурації Selenium-wire або розширення

Керування безголовим режимом (Headless) з проксі

Запуск Selenium у безголовому режимі (--headless) є стандартом для серверних скриптів. Однак безголовий Chrome іноді може "витікати" вашу реальну IP-адресу або не завантажувати розширення. Якщо ви використовуєте метод розширення для автентифікації, ви повинні використовувати новіший безголовий режим, доступний у Chrome 109+, щоб забезпечити правильне завантаження розширень:

options.add_argument('--headless=new')

Прапор --headless=new гарантує, що середовище браузера більш точно імітує звичайний браузер, підвищуючи надійність автентифікації проксі та знижуючи шанси на виявлення просунутими скриптами захисту від ботів.

Усунення поширених проблем із проксі

Навіть при правильному налаштуванні проксі в Selenium можуть виникати проблеми. Ось найчастіші з них та їхні технічні рішення:

  • ProxyConnectionError: Часто викликана неправильним портом або фаєрволом, що блокує вихідне з'єднання з проксі-провайдером. Переконайтеся, що порт 10000 (або порт вашого провайдера) відкритий.
  • Витік DNS: За замовчуванням Selenium все ще може дозволяти DNS-запити через вашого локального провайдера. Щоб запобігти цьому, особливо при використанні SOCKS5, переконайтеся, що браузер налаштований на виконання DNS-запитів через проксі.
  • Повільне завантаження: Резидентні проксі за своєю природою повільніші за проксі дата-центрів. Якщо продуктивність критична, використовуйте пул дата-центрів GProxy, якщо ви не стикаєтеся з агресивним блокуванням IP.
  • Спливаючі вікна автентифікації: Якщо ви бачите вікно входу, ваш метод автентифікації (розширення або Selenium-wire) не спрацював або не ініціалізувався перед першим запитом.

Основні висновки

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

  • Використовуйте GProxy Backconnect: Замість керування списком із 10 000 IP у вашому коді Python, використовуйте єдиний ендпоінт backconnect, наданий GProxy, для автоматичної ротації.
  • Надавайте перевагу розширенням: Для продакшн-середовищ метод розширення Chrome кращий за Selenium-wire, оскільки він не вводить додатковий рівень проксі, що забезпечує меншу затримку.
  • Моніторте успішність запитів: Завжди обгортайте виклики driver.get() у блоки try-except для перехоплення WebDriverException, що дозволить вашому скрипту змінити ID сесії та повторити спробу, якщо вузол проксі вийде з ладу.
support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.