Skip to content
Intermediate / 2 min read

Ротация прокси в Python Requests: как менять IP для веб-скрапинга (и когда лучше шлюз WireGuard)

Узнайте, как ротировать прокси в Python requests для надёжного веб-скрапинга, включая поддержку SOCKS5, работу с сессиями и восстановление после ошибок. Сравните ротационные прокси с выделенными шлюзами WireGuard для задач, требующих стабильного IP.

SOCKS5 WireGuard Веб-скрейпинг Приватность/Анонимность

Обзор

Ротация прокси с помощью Python requests — распространённый способ распределять запросы веб-скрапинга между несколькими IP-адресами, снижая риск ограничения скорости или блокировок. В этом руководстве показано, как реализовать ротацию прокси в Python requests, включая HTTP- и SOCKS5-прокси, логику повторных попыток и проверку. Также объясняется, когда выделенный шлюз WireGuard (например, NordLayer) подходит больше, чем ротационные прокси.

Предварительные требования

  • Установленный Python 3.8 или более поздней версии.
  • Библиотека requests.
  • Для SOCKS5-прокси установите requests[socks], которая включает PySocks.
  • Список прокси-серверов (HTTP, HTTPS или SOCKS5) от провайдера.

Как работает ротация прокси в Python Requests

requests поддерживает прокси через параметр proxies. Каждый запрос может использовать другой прокси, если вы меняете прокси перед вызовом requests.get(). Для SOCKS5 используется схема socks5:// или socks5h:// (для разрешения DNS через прокси).

Шаги

  1. Установите необходимые библиотеки.
    pip install requests requests[socks]
    
  2. Подготовьте список прокси. Храните учётные данные в переменных окружения или файле конфигурации, а не в исходном коде.
    import os
    proxies_list = [
        'http://user:[email protected]:8080',
        'http://user:[email protected]:8080',
        'socks5://user:[email protected]:1080',
    ]
    
  3. Выберите стратегию ротации. Проще всего циклически перебирать список.
    from itertools import cycle
    proxy_pool = cycle(proxies_list)
    
  4. Отправляйте запросы с ротацией прокси. Указывайте тайм-ауты и обрабатывайте исключения.
    import requests
    url = 'https://httpbin.org/ip'
    for i in range(5):
        proxy = next(proxy_pool)
        try:
            resp = requests.get(url, proxies={'http': proxy, 'https': proxy}, timeout=10)
            print(resp.json())
        except requests.exceptions.RequestException as e:
            print(f'Proxy {proxy} failed: {e}')
    
  5. Для более надёжной ротации объедините ротацию с логикой повторных попыток, используя requests.Session и HTTPAdapter.
    from requests.adapters import HTTPAdapter
    from urllib3.util.retry import Retry
    
    session = requests.Session()
    retries = Retry(total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504])
    session.mount('http://', HTTPAdapter(max_retries=retries))
    session.mount('https://', HTTPAdapter(max_retries=retries))
    
    proxy = next(proxy_pool)
    resp = session.get(url, proxies={'http': proxy, 'https': proxy}, timeout=10)
    print(resp.json())
    
  6. Убедитесь, что IP меняется. Конечная точка https://httpbin.org/ip возвращает исходный IP. Логируйте или выводите его для каждого запроса.
  7. Реализуйте проверки работоспособности. Удаляйте из пула прокси, которые постоянно дают сбой.
    def is_proxy_alive(proxy):
        try:
            requests.get('https://httpbin.org/ip', proxies={'http': proxy, 'https': proxy}, timeout=5)
            return True
        except requests.exceptions.RequestException:
            return False
    
    healthy_proxies = [p for p in proxies_list if is_proxy_alive(p)]
    

Устранение типичных проблем

  • 407 Proxy Authentication Required: Проверьте имя пользователя и пароль в URL прокси. Закодируйте специальные символы в процентной кодировке.
  • Ошибки подключения SOCKS5: Убедитесь, что вы установили requests[socks] и что URI прокси использует socks5:// или socks5h://.
  • Ошибки SSL: Некоторые прокси не поддерживают туннелирование HTTPS. Используйте HTTP-прокси только для HTTP-целей или переключитесь на провайдера, поддерживающего CONNECT.
  • Медленные ответы: Увеличьте тайм-аут, уменьшите параллелизм или используйте прокси с меньшей задержкой.
  • IP не меняется: Убедитесь, что прокси действительно используется, проверив resp.json(). Также проверьте, что ваш код меняет прокси перед каждым запросом.

Когда выделенный шлюз WireGuard имеет больше смысла

Ротационные прокси идеальны для крупномасштабного анонимного скрапинга, когда каждый запрос может исходить с другого IP. Однако некоторые задачи требуют стабильного выделенного IP-адреса:

  • Поддержание сессии с выполненным входом на сайте, который отмечает смену IP.
  • Отслеживание позиций в SEO из фиксированного местоположения.
  • Доступ к внутренним инструментам или API с разрешёнными IP-адресами. В таких случаях выделенный шлюз WireGuard, например NordLayer, обеспечивает стабильный VPN-туннель бизнес-класса с фиксированной ежемесячной оплатой. NordLayer предлагает выделенные шлюзы, поэтому ваша команда получает согласованный IP для безопасного сетевого доступа. Это не сервис ротационных прокси, но он дополняет ротационные прокси, покрывая сценарии, где нужен фиксированный исходящий IP.

Итог

Вы можете ротировать прокси в Python requests, циклически перебирая список прокси, обрабатывая исключения и проверяя исходный IP. Для SOCKS5 установите requests[socks]. Используйте логику повторных попыток и проверки работоспособности, чтобы скрапинг оставался надёжным. Когда вместо ротации нужен стабильный выделенный IP, рассмотрите выделенный шлюз WireGuard, например NordLayer, для командного доступа и задач с фиксированным IP.