Капчи при парсинге: почему появляются и что делать
Капча появляется при парсинге, когда сайт решает, что запрос выглядит автоматизированным. Обычные причины — слишком много запросов за короткое время, 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, с указанием способа связаться с вами.
- Держите частоту запросов низкой. Капча часто означает, что сайт просит вас замедлиться.
- Остановитесь, если сайт этого просит, и не обходите блокировку, о которой вам сказали уважать.
- Обращайтесь с персональными данными по правилам конфиденциальности, которые на вас распространяются, и собирайте только нужное.