Scarnox · Blog

Капчи при парсинге: почему появляются и что делать

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

Почему сайты показывают капчу парсерам

Сайту мало что помогает отличить человека от скрипта в момент запроса страницы, поэтому он смотрит на паттерны. Парсер часто выделяется тем, что:

Достаточно любого из этих признаков. Капча — способ сайта попросить шаг, похожий на человеческий, прежде чем отдавать дальше страницы. Снижение паттерна обычно снижает количество капч, а это дешевле, чем их решать.

Обнаружение капчи в коде

Прежде чем что-либо решать, проверьте, является ли полученная страница вообще страницей капчи. Простая проверка ищет разметку виджета и читает sitekey:

import re
import requests

SITEKEY_RE = re.compile(r'data-sitekey="([0-9a-f-]{36})"')

def fetch(url: str) -> dict:
    resp = requests.get(
        url,
        timeout=30,
        headers={"User-Agent": "ExampleBot/1.0 (+https://example.com/bot)"},
    )
    html = resp.text
    if "h-captcha" in html or "g-recaptcha" in html:
        match = SITEKEY_RE.search(html)
        return {"captcha": True, "sitekey": match.group(1) if match else None, "html": html}
    return {"captcha": False, "sitekey": None, "html": html}

page = fetch("https://example.com/search?q=shoes")
if page["captcha"]:
    print("captcha found, sitekey:", page["sitekey"])

Строки h-captcha и g-recaptcha — лишь разметка, которую использует страница, поэтому это сигнал, а не гарантия. Если sitekey не найден, см. как найти sitekey капчи.

Решите, когда избежать не получается

Когда на странице есть виджет PopularCaptcha и вы знаете его sitekey, можно запросить токен у API Scarnox одним POST-запросом и отправить его в поле h-captcha-response. Полная функция с обработкой ошибок — в решении капчи на Python одним запросом. Используйте токен сразу, потому что он истекает примерно через две минуты. Детали тайминга — в истечении срока токена капчи.

Живая поддержка Scarnox сегодня — PopularCaptcha, без прокси и со своим прокси. reCAPTCHA v2 и v3, Cloudflare Turnstile, GeeTest, AWS WAF и Arkose скоро появятся. Если ваша цель использует что-то из этого, руководства по капче объясняют общие варианты, но не стройте производственный поток на решении, которое не работает в режиме онлайн.

Порядок решений для каждой заблокированной страницы

Когда ваш парсер натыкается на капчу, простой порядок решений сохраняет задачу честной и снижает объем запросов:

  1. Есть ли источник данных, который можно использовать вместо страницы? Если API, фид или экспорт покрывает нужные поля, переключитесь на него и перестаньте запрашивать эту страницу.
  2. Разрешает ли robots.txt этот путь? Если нет, пропустите его. Не решайте капчу на странице, которую вас просили не трогать.
  3. Вы отправляли слишком много слишком быстро? Сделайте более длинную паузу, снизьте частоту и проверьте снова позже. Многие капчи пропадают при более медленном темпе.
  4. Эта капча — живой тип? Если это PopularCaptcha, применимо решение из этого руководства. Если тип скоро появится, держите задачу на паузе и следите за релизом.
  5. Разрешено ли автоматизировать эту страницу? Если ответ неясен, спросите владельца сайта, прежде чем продолжать.

Четвертый шаг чаще всего пропускают. Решатель полезен только тогда, когда тип капчи поддерживается, а задача, которая повторяет неподдерживаемый тип, тратит время и запросы впустую.

Обрабатывайте капчу в задаче, а не в цикле

Помещайте решение внутрь пути кода, которому нужен токен, чтобы задача могла логировать каждую капчу, остановиться, когда страница постоянно падает, и двигаться дальше. Бесконечный цикл, который снова и снова запрашивает страницу с капчей, — самый быстрый способ, чтобы файрвол сайта навсегда заблокировал ваш адрес.

Следите за тем, что падает

Ведите счетчик страниц, которые возвращают капчу, с группировкой по URL и времени суток. Капча, которая появляется только в одном разделе сайта или только после определенного числа запросов, показывает, где именно триггер. Эта информация полезнее более быстрого решателя, потому что показывает, что нужно изменить.

Чего не делать

Ответственный парсинг

Следующие шаги