Капчі у веб-скрапінгу: чому вони з'являються і що робити
Капча з'являється під час скрапінгу, коли сайт вирішує, що запит виглядає автоматизованим. Типові причини - забагато запитів за короткий час, IP-адреса з поганою репутацією, відсутні ознаки браузера або звернення до сторінки, яку сайт захищає суворіше за решту. Практична реакція має три кроки, у такому порядку: зменшити причини, визначити капчу в коді і розв'язати ту капчу, яку неможливо уникнути. Цей посібник розглядає кожен крок і вказує на детальні посібники для решти.
Чому сайти показують капчі скраперам
Сайт мало що може зробити, щоб відрізнити людину від скрипта в момент запиту сторінки, тож він дивиться на шаблони. Скрапер часто виділяється тим, що:
- надсилає запити швидше, ніж міг би клікати будь-хто;
- повторює той самий шлях без паузи;
- приходить з адреси дата-центру, а не з домашньої мережі;
- надсилає заголовки, які не відповідають поширеному браузеру, або
- не зберігає cookie і стан сесії між запитами.
Достатньо будь-чого з цього. Капча - це спосіб сайту попросити людиноподібний крок, перш ніж віддавати більше сторінок. Зменшення шаблону зазвичай зменшує кількість капч, а це дешевше, ніж їх розв'язувати.
Визначення капчі в коді
Перш ніж щось розв'язувати, перевірте, чи отримана сторінка взагалі є сторінкою з капчею. Простий тест шукає розмітку віджета і зчитує 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 скоро з'являться. Якщо ваша ціль використовує один із них, посібники з капч пояснюють загальні варіанти, але не будуйте продакшен-потік на розв'язанні, якого ще немає в роботі.
Рішення для кожної заблокованої сторінки
Коли ваш скрапер натрапляє на капчу, простий порядок рішень тримає завдання чесним і знижує обсяг запитів:
- Чи є джерело даних, яке можна використати замість? Якщо API, фід або експорт покривають потрібні поля, перейдіть на нього і перестаньте запитувати цю сторінку.
- **Чи дозволяє
robots.txtцей шлях?** Якщо ні, пропустіть його. Не розв'язуйте капчу на сторінці, яку вас просили не чіпати. - Чи надсилали ви забагато занадто швидко? Зробіть довшу паузу, знизьте частоту і перевірте пізніше. Багато капч зникають при повільнішому темпі.
- Чи є капча живим типом? Якщо це PopularCaptcha, застосовується розв'язання з цього посібника. Якщо це тип, що скоро з'явиться, призупиніть завдання і стежте за релізом.
- Чи є сторінка, яку ви маєте право автоматизувати? Якщо відповідь неясна, запитайте власника сайту, перш ніж продовжувати.
Четвертий крок найчастіше пропускають. Розв'язувач корисний лише тоді, коли тип капчі підтримується, а завдання, яке повторює непідтримуваний тип, марнує час і запити.
Обробляйте капчу в завданні, а не в циклі
Розміщуйте розв'язання в тому шляху коду, якому потрібен токен, щоб завдання могло записувати кожну капчу, зупинятися, коли сторінка постійно падає, і рухатися далі. Нескінченний цикл, що постійно запитує сторінку з капчею, - найшвидший спосіб, щоб файрвол сайту заблокував вашу адресу назавжди.
Стежте за невдачами
Ведіть облік сторінок, які повертають капчу, згрупованих за URL і часом доби. Капча, що з'являється лише в одному розділі сайту або лише після певної кількості запитів, показує, де сидить причина. Ця інформація корисніша за швидший розв'язувач, бо вона показує, що саме змінити.
Чого не робити
- Не розподіляйте запити між багатьма IP-адресами, щоб обійти ліміти сайту. Це обхід, і він перетворює прохання сповільнитися на бійку.
- Не скрапіть сторінки за логіном з обліковими даними, на використання яких у вас немає дозволу.
- Не розв'язуйте капчі, щоб створювати облікові записи, розсилати спам або купувати обмежені товари.
Скрапінг відповідально
- Прочитайте
robots.txtі умови використання сайту перед початком. Дотримуйтеся заборонених шляхів і будь-якої затримки для краулера. - Чесно вказуйте свого бота в User-Agent, із способом зв'язатися з вами.
- Тримайте частоту запитів низькою. Капча часто означає, що сайт просить вас сповільнитися.
- Зупиніться, якщо сайт вас про це просить, і не обходьте блокування, яке вам сказали поважати.
- Поводьтеся з персональними даними згідно з правилами приватності, що на вас поширюються, і збирайте лише потрібне.