Остановить скраперов, не заблокировав Google
Как отличить нужного краулера от ненужного, почему проверка по User-Agent хуже, чем бесполезна, и что делать с теми, кто просто ведёт себя приличнее ваших правил.
Проблема не в скрапинге, а в том, чтобы их различить
Почти каждому сайту нужен какой-то автоматический трафик. Поисковики, сборщики превью за ссылками в мессенджерах и соцсетях, ваш собственный мониторинг, интеграция партнёра, средство доступности. И почти у каждого сайта есть автоматический трафик, который ему не нужен: скраперы цен, зеркала контента, боты по остаткам и всё чаще краулеры для обучения ИИ, польза которых для вас — вопрос мнения.
И те и другие приходят как HTTP-запросы от программ. Ни те ни другие не скажут о себе правду, если сами не захотят. Значит, вся задача сводится к классификации, и у каждой ошибки классификации своя цена, направленная в свою сторону.
Заблокируете не того — выпадете из индекса, и эту ошибку замечают неделями, а откатывают дольше. Пропустите не того — ваши цены будут на сайте конкурента в течение часа. Настройки, безопасной в обе стороны, не существует, поэтому делать это стоит внимательно, а не быстро.
Почему проверка по User-Agent не работает
User-Agent — это строка, которую выбирает клиент. Это заявление, а не доказательство, и обращение с ним как с доказательством ошибается сразу в обе стороны.
Назваться Googlebot может кто угодно, и скраперы так и делают: это одна строка конфигурации, и она работает против любого сайта, который проверяет строку. Если ваше правило звучит как «пропускать Googlebot», вы написали «пропускать всё, что назвалось Googlebot».
Одновременно вы заблокируете настоящих краулеров, которых хотели оставить, потому что перечислить их невозможно. Легальных сборщиков десятки, строки у них вы никогда не видели, и каждый месяц появляется новый.
Правильная проверка — не сравнение строк. Для крупных краулеров это обратный DNS-запрос по адресу отправителя с подтверждением, что имя резолвится в домен самого оператора, и затем прямой запрос с подтверждением, что это имя резолвится обратно в тот же адрес. Несколько операторов дополнительно публикуют подписанные списки диапазонов, которые можно скачивать и кешировать.
Это несложно, но делать это нужно для каждого краулера, который вам важен, поддерживать при смене диапазонов и кешировать, чтобы не ходить в DNS прямо в пути запроса.
robots.txt — это табличка, а не забор
robots.txt сообщает воспитанным краулерам, чего вы предпочли бы. Поисковики его соблюдают, потому что попасться на нарушении им дороже, чем стоит содержимое. У скрапера такого стимула нет и репутации, которую надо беречь, тоже.
Хуже того, это публичный документ, перечисляющий пути, которые вы сочли достаточно чувствительными, чтобы упомянуть. Запретив /admin, /export или /api/internal, вы объявили, что они существуют. Пишите его как указание доверенным краулерам, а не как средство защиты.
Вести его всё равно стоит. Корректный robots.txt с директивами задержки снижает нагрузку от тех краулеров, которые его уважают, — а это большая часть объёма на большинстве сайтов, — и это единственный рычаг, который у вас есть в отношении ИИ-краулеров, публикующих токен отказа.
Что действительно их разделяет
По убыванию того, какую долю ответа даёт каждый пункт.
Проверка для тех, кого можно проверить. Обратный и прямой DNS или опубликованный список диапазонов решают вопрос по крупным поисковикам окончательно. Это должно быть жёсткое разрешение, и стоять оно должно выше всех остальных правил.
Транспортные отпечатки для остальных. Скрапер — это программа: curl, библиотека на Python, headless-браузер, HTTP-клиент на Go. Его TLS-рукопожатие объявляет, какая именно, через упорядоченный набор шифронаборов и расширений, сведённый в JA3/JA3N. Клиент, называющий себя Chrome под Windows и предъявляющий отпечаток, которого Chrome не даёт, сам сказал вам, что он такое.
Поведение в пределах сессии. Запрашивает ресурсы, но никогда их не исполняет; частота запросов ровная до миллисекунды; путь по сайту следует карте сайта, а не навигации; никакого движения мыши на странице с интерактивными элементами. По отдельности ни один признак не решающий, вместе — почти.
Репутация для первого контакта. У совершенно нового адреса нет истории с вами. Если на прошлой неделе он скрапил кого-то другого, это единственный сигнал, доступный на самом первом его запросе.
Блокировка, которая не бьёт по своим
Что вы делаете с подтверждённым скрапером, важно не меньше, чем как вы его обнаружили.
Не показывайте капчу. Упорному скраперу она стоит долей цента через сервис решения, а вам — тех живых пользователей, которых она заодно ловит.
Не заблокируйте поисковики по недосмотру. Подтверждённые краулеры должны пропускаться правилом, которое отрабатывает раньше любой оценки, чтобы ошибка в оценке не стоила вам позиций в выдаче. Проверяйте это после каждого изменения, а не до.
Подумайте о медленной полосе вместо стены. Отдавать скраперу нарочито медленно или из устаревшего кеша часто лучше, чем 403: это стоит ему времени, а не подсказывает сменить тактику, и не создаёт того инцидента, который случается, когда вы заблокировали нужное.
Ограничивайте частоту там, где дорого. Ваш поиск и ваш товарный API заслуживают лимитов, которых не заслуживают статические страницы.
Следите за тем, что отдаёте, а не только за тем, что блокируете. Скрапер, начавший проходить, выглядит на дашборде блокировок ровно как спокойная неделя. Ведите отношение заблокированного к отданному во времени и настраивайте оповещение на отношение.
Где здесь Karma
Karma проверяет легальных краулеров сама и исключает их из ваших вердиктов — и из счёта, потому что брать с вас деньги за опознание Googlebot значило бы брать деньги за собственную работу продукта.
Всё остальное оценивается по поведенческим и транспортным сигналам, а вердикт уходит на ваш шлюз, чтобы решали вы: блокировка это, медленная полоса или устаревший кеш. Ваши списки разрешений и запретов всегда перебивают платформу, поэтому партнёра, от которого вы зависите, можно закрепить до того, как что-то включать.
Бесплатный тариф Detect гоняет классификацию с выключенной блокировкой. Именно здесь так начинать особенно правильно: дорогая ошибка в этой области — узнать, что правила были неверны, по падению поискового трафика через три недели.