Scraping

Веб-скрапинг в масштабе: когда и зачем использовать публичные прокси

5 min read Published Updated 993 words

Ротация прокси — это костыль, а не решение. Большинство операций по сбору данных терпят неудачу, потому что они рассматривают IP-адреса как единственный сигнал, измеряемый антибот-системами. Реальность такова, что современные менеджеры ботов — Akamai Bot Manager, Cloudflare Turnstile, Datadome — снимают отпечатки гораздо большего, чем ваш исходный IP. Ротируемый пул бесплатных публичных прокси почти ничего не даёт против этих систем и часто только ухудшает ситуацию.

Иллюзия ротации IP

Когда вы меняете IP при каждом запросе, вы выдаёте себя за скрапер. Человеческие паттерны просмотра показывают липкие сессии — один IP в течение минут или часов, стабильные отпечатки браузера и предсказуемые интервалы между запросами. Инструменты вроде requests с объектом Session и ротируемым списком прокси нарушают все эти сигналы. Заголовок X-Akamai-Device-Fingerprint от Akamai и корреляция cf-request-id от Cloudflare могут связывать запросы с разных IP, если параметры TLS, настройки HTTP/2 и тайминги остаются одинаковыми. JavaScript-челлендж Datadome проверяет артефакты headless-браузеров, которые сохраняются при смене прокси. Ротация IP без ротации полного отпечатка клиента — это как сменить номерной знак, но ездить на той же машине: камеры на платных дорогах всё равно вас засекут.

Для низкоскоростного и малообъёмного сбора данных с сайтов, использующих только базовое IP-ограничение (например, 10 запросов в минуту без JavaScript-челленджей), часто достаточно одного резидентного IP. Я годами запускал скраперы против государственных порталов данных и публичных API, используя один статический IP и вежливый time.sleep(2). Никакой прокси не нужен. Правило простое: если сайт не выдаёт страницу с челленджем или CAPTCHA после 50 запросов, ротация вам не нужна.

За пределами IP-адреса: снятие отпечатков

Антибот-системы теперь собирают десятки сигналов на каждый запрос. Строка User-Agent тривиально подделывается, но Accept-Language, Sec-CH-UA, Connection и порядок Accept-Encoding — нет. Ещё более критично снятие отпечатков TLS, стандартизированное в хеше JA3 (см. JA3), которое идентифицирует клиентскую библиотеку по порядку наборов шифров и списку расширений TLS. Библиотека requests в Python (через urllib3) даёт хеш JA3, отличный от Chrome 124. Cloudflare Turnstile и Datadome оба проверяют JA3. Ротация IP при сохранении того же стека TLS делает каждый запрос похожим на один и тот же автоматизированный клиент, просто перепрыгивающий между выходными узлами. Бесплатные прокси усугубляют это, так как они часто используют устаревшие версии OpenSSL или TLS-конфигурации, похожие на ботов, которые уже занесены в чёрные списки.

Снятие отпечатков HTTP/2 идёт ещё дальше. Кадр SETTINGS, значения обновления окна и параметры параллелизма потоков образуют уникальный «отпечаток HTTP/2», который Akamai Bot Manager отслеживает между сессиями. Ротируемый пул прокси, который не меняет реализацию HTTP/2, тривиально кластеризуется. Единственный способ обойти эти проверки — использовать реальный браузерный движок (Puppeteer, Playwright) или тщательно настроенный стек TLS/HTTP, имитирующий конкретную версию браузера — и даже в этом случае нужно сохранять один и тот же отпечаток для всех запросов в рамках данной сессии.

Экономика бесплатных публичных пулов прокси

В моих тестах бесплатные публичные списки прокси имеют 60–80% отказов. Большинство прокси либо мертвы с самого начала, либо ограничены хостом, либо уже помечены крупными менеджерами ботов. Среднее время жизни бесплатного SOCKS5-прокси, взятого из публичного каталога, составляет менее 15 минут. Поддержание ротируемого пула из 500 прокси означает, что вы сжигаете тысячи IP в час, и 80% ваших запросов либо истекают по таймауту, либо возвращают 403. Пропускная способность ненадёжна, задержки скачут, а многие бесплатные прокси внедряют рекламу или изменяют тело ответа. Платные резидентные прокси-сети (например, Bright Data, Oxylabs) обеспечивают 95%+ успешных запросов и опции липких сессий, но стоят $10–$20 за ГБ. В масштабе математика склоняется в пользу резидентных прокси только тогда, когда нужно обходить IP-блокировки на высокоценных целях. Во всех остальных случаях один чистый IP с правильным темпом запросов превосходит хаотичный бесплатный пул.

Когда ротация действительно работает

Ротация прокси эффективна против одной конкретной угрозы: IP-ограничений, которые сбрасываются на каждый IP. Если сайт использует простую проверку X-Forwarded-For или токеновое ведро на IP, ротация после каждого запроса обходит лимит. Это распространено на небольших сайтах электронной коммерции и устаревших API, которые так и не обновили свою систему обнаружения ботов. В таких случаях даже бесплатный пул прокси работает — но только если вы реализуете логику повторных попыток, отбрасывающую неработающие прокси и быстро переключающуюся на свежие.

Вот минимальный пример на Python с использованием requests и цикла повторных попыток с ротацией. Предполагается, что список URL прокси находится в proxy_list, а целевой url:

import requests
from itertools import cycle

proxy_pool = cycle(proxy_list)
max_retries = 5

for attempt in range(max_retries):
    proxy = next(proxy_pool)
    try:
        resp = requests.get(
            url,
            proxies={"http": proxy, "https": proxy},
            timeout=10,
            headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..."}
        )
        if resp.status_code == 200:
            break
    except (requests.ConnectionError, requests.Timeout):
        continue
else:
    raise RuntimeError("All proxies failed")

Этот паттерн работает только тогда, когда обнаружение сайта основано исключительно на IP. Добавьте time.sleep(random.uniform(1,3)) между запросами, чтобы имитировать человеческий темп. Для сайтов, использующих Turnstile или Datadome, этот код будет ошибаться каждый раз — страница с челленджем вернёт 403 или CAPTCHA независимо от прокси. В таких случаях вам нужен headless-браузер с реальным отпечатком, а не ротируемый список IP.

Липкие сессии — сохранение одного и того же IP для набора связанных запросов — часто более эффективны, чем ротация на каждый запрос. Многие сайты электронной коммерции ожидают один IP для сессии просмотра (например, добавление товаров в корзину, оформление заказа). Ротация в середине сессии вызывает срабатывание флагов мошенничества. Используйте пул прокси, но назначайте один IP на сессию, а не на запрос. Бесплатные прокси редко поддерживают липкие сессии, потому что один и тот же IP используется несколькими пользователями; вы столкнётесь с перекрёстным загрязнением данных сессии. Платные резидентные прокси предлагают длительность липких сессий (5–30 минут), что соответствует естественному поведению просмотра.

Выбирайте ротацию только тогда, когда понимаете стек обнаружения цели. Сначала тестируйте с одним IP. Добавляйте ротацию только если наткнулись на ограничение скорости. И никогда не полагайтесь на бесплатные прокси в продакшене — их уровень отказов обойдётся вам дороже в инженерном времени и потерянных данных, чем дешёвый резидентный план.