Как избежать CAPTCHA при парсинге (уберите сигналы, а не решайте)

Решение CAPTCHA медленное, дорогостоящее и устраняет только симптом. Долговременное решение — никогда не вызывать его: снизьте свой риск-оценку, очистив сигналы, которые его вызывают.

Инстинкт, когда парсер сталкивается с CAPTCHA, — обратиться к сервису решения. Это неправильный инстинкт. CAPTCHA — это не стена, которую нужно пробить, а видимый результат риск-оценки, которая уже решила, что вы выглядите автоматизированно. Решение медленное, стоит денег за каждое решение и не снижает эту оценку, поэтому следующий запрос снова сталкивается с вызовом. Долговременный ответ на как избежать CAPTCHA при парсинге — это перестать их вызывать: очистите несколько сигналов, которые толкают вашу оценку в красную зону.

Почему решение — проигрышный ход

Рассмотрите, как на самом деле работает reCAPTCHA v2. Сайт встраивает публичный ключ сайта; решение задачи записывает длинный токен в скрытое поле g-recaptcha-response, которое сервер затем проверяет. Этот токен одноразовый по замыслу — мера защиты от повторного использования — поэтому вы не можете решить один раз и использовать его повторно. Сервисы решения (человеческие фермы или ML-решатели) возвращают свежий токен на каждую задачу, что означает, что вы платите и ждете секунды каждый раз, когда оценка остается высокой. Вы автоматизировали симптом, но не устранили причину.

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

Диаграмма диапазона риск-оценки, показывающая, как репутация IP, TLS-отпечаток, заголовки, скорость запросов и cookies толкают парсер к CAPTCHA
Вызов — это результат. То, что вы действительно можете контролировать, — это риск-оценка, которая его производит.

Сигнал 1: качество IP — самый большой рычаг

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

Прежде чем доверять любому пулу, измерьте его. Наш бесплатный проверщик качества IP показывает оценку мошенничества/репутации, которую антибот-движок присвоил бы выходу — IP-адрес дата-центра с высокой оценкой мошенничества — это CAPTCHA, которая ждет, чтобы случиться. Если вы хотите полную картину, почему репутация побеждает отпечаток на большинстве сайтов, наша статья о почему оценка мошенничества имеет значение углубляется в это.

import requests

# Detect a challenge in the response and rotate the exit instead of retrying
CHALLENGE_MARKERS = ("g-recaptcha", "hcaptcha", "/cdn-cgi/challenge", "captcha-delivery")

def looks_challenged(resp):
    if resp.status_code in (403, 429, 503):
        return True
    body = resp.text[:20000].lower()
    return any(m in body for m in CHALLENGE_MARKERS)

def fetch(url):
    # rotating gateway hands out a new residential IP each request
    proxy = "http://USER:PASS@rotating.quantumproxies.io:8000"
    r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=20)
    if looks_challenged(r):
        return None  # burn this exit, the gateway rotates on the next call
    return r

Сигнал 2: ваш TLS-отпечаток выдает вас

Даже на чистом IP рукопожатие TLS выдает вас. Сырой запрос из стандартного стека Python или Go создает отпечаток JA3/JA4, который совсем не похож на отпечаток Chrome — настоящий браузер рекламирует определенный порядок шифров, расширения и значения ALPN, которые скриптовые библиотеки не воспроизводят. Антибот-движки хешируют это рукопожатие и сопоставляют его с известными бот-подписями. Решение — отправить подлинный отпечаток браузера, либо через клиент имитации TLS, либо запустив настоящий движок браузера. Мы объясняем механику в как работает отпечаток JA3/JA4.

Сигнал 3: согласованность заголовков

Заголовки должны согласовываться друг с другом и с отпечатком. Запрос, который утверждает, что это Chrome 120 на Windows, но пропускает соответствующие клиентские подсказки sec-ch-ua, отправляет заголовки в неправильном порядке или сочетает мобильный User-Agent с десктопным профилем TLS, тривиально несогласован. Не просто устанавливайте User-Agent — отправляйте полный согласованный набор, который отправил бы реальный браузер, и поддерживайте его согласованность с платформой, которую вы имитируете.

# Coherent header set that matches a Chrome-on-Windows fingerprint
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "sec-ch-ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
    "sec-ch-ua-platform": '"Windows"',
    "Upgrade-Insecure-Requests": "1",
}
Контрольный список из двух колонок, сопоставляющий сигналы, вызывающие CAPTCHA, с их мерами смягчения
Работайте по левой колонке вниз к правой колонке, и вызов перестанет появляться в первую очередь.

Сигнал 4: поведение и скорость

Частота запросов на один IP — это основной сигнал скорости. Шестьдесят запросов в минуту с одного адреса читаются как бот; те же шестьдесят, распределенные по шестидесяти IP, читаются как шестьдесят человек. Замедлитесь, добавьте джиттер между запросами и распределите объем по пулу. На JavaScript-насыщенных целях оценка поведения также следит за движением мыши, прокруткой и временем пребывания — если вы управляете безголовым браузером, не запускайте клики мгновенно. Ротация снижает блокировку на основе IP; она не оправдывает шаблон запросов как из пулемета. Полная дисциплина изложена в нашем контрольном списке против бана.

Сигнал 5: непрерывность сессии и cookies

Существует пятый, более тихий сигнал: непрерывность. Запрос, который приходит без cookies, без реферера и без истории, выглядит так, будто он материализовался из ниоткуда — именно так поступает наивный бот. Реальные пользователи накапливают сессию: они попадают на страницу, получают установленные cookies и переносят их вперед через клики. Сохраняйте cookies в пределах сессии, входите через правдоподобные страницы, а не углубляйтесь холодно в защищенный маршрут, и сохраняйте одну идентичность на протяжении всего согласованного потока. Ротация IP в середине входа делает противоположное — она разрывает непрерывность и повышает оценку — именно поэтому существуют липкие сессии для шагов с сохранением состояния, таких как корзины и входы.

Когда вызов неизбежен

Некоторые маршруты блокируют каждого посетителя — стена входа, оформление заказа, агрессивно защищенный поиск. Там никакое количество гигиены сигналов не убирает вызов, и поддержание отпечатков браузера, имитация TLS и чистый пул вручную становится отдельным проектом. Это момент, чтобы передать весь стек Scraper API, который несет подлинный отпечаток браузера, вращает резидентные IP и рендерит JavaScript по запросу — вы отправляете URL и получаете HTML или JSON обратно, включая обработку вызовов. Это меньше движущихся частей, чем самодельная ферма решателей, и более высокая вероятность успеха.

Начните с чистых резидентных IP

Часто задаваемые вопросы

Как избежать CAPTCHA при веб-парсинге?

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

Лучше решать или избегать CAPTCHA?

Избегать. Решение — это на каждый вызов, стоит денег и времени, и токен reCAPTCHA одноразовый, поэтому постоянно высокая риск-оценка означает, что вы платите снова за каждый запрос. Профилактика устраняет причину один раз. Оставьте решение для редкого маршрута, который вызывает каждого посетителя, независимо от того, насколько чисты ваши сигналы.

Останавливают ли резидентные прокси CAPTCHA?

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

Почему я получаю CAPTCHA даже на резидентном IP?

Потому что IP — это только один входной сигнал. Ваш TLS/JA3 отпечаток, согласованность заголовков, скорость запросов и отсутствие cookies сессии все еще влияют на оценку. Однажды отмеченный резидентный выход также может нести недавнюю историю. Проверьте выход с помощью бесплатного инструмента оценки качества IP, отправьте подлинный отпечаток браузера и замедлите скорость запросов, прежде чем предполагать, что проблема в IP.

Перестаньте считать CAPTCHA препятствием. Это результат всего, что вы отправили до его появления. Очистите IP, отпечаток, заголовки и скорость, и результат останется зеленым — решатель не потребуется.

Проверьте оценку мошенничества вашего выходного IP бесплатно