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 і часом доби. Капча, що з'являється лише в одному розділі сайту або лише після певної кількості запитів, показує, де сидить причина. Ця інформація корисніша за швидший розв'язувач, бо вона показує, що саме змінити.

Чого не робити

Скрапінг відповідально

Що далі