Копия сайта для ИИ-ботов: почему расхождение в одной цифре важнее процента совпадения
Сайты всё чаще отдают ИИ-краулерам отдельную отрендеренную версию страниц, поскольку большинство ботов не исполняет JavaScript. Эксперимент с тестовым сайтом показал: копия может совпадать с человеческой страницей почти полностью и при этом содержать устаревшую цену, которую нейросеть процитирует как актуальную.
Практика подмены контента для ИИ-краулеров стала предметом разбора после публикации в потоке «Разработка». Автор собрал тестовый сайт из трёх синтетических страниц и сравнил то, что видит обычный пользователь в браузере, с тем, что получает бот с идентификатором GPTBot в User-Agent. Поводом послужили сервисы вроде Profound, которые распознают бота и отдают ему заранее отрендеренную копию страницы. Смысл схемы в том, чтобы обойти неспособность краулеров исполнять скрипты, но побочным эффектом становится расхождение между двумя версиями одного и того же адреса.
Исходная проблема связана с архитектурой современных сайтов: если страница собирается в браузере с помощью JavaScript, бот, не исполняющий скрипты, видит пустой HTML. По данным за 2024 год, собранным на сайтах инфраструктуры Vercel и в сети MERJ, основные ИИ-краулеры скрипты не выполняют: JS-файлы составили 11,5% запросов ChatGPT и 23,8% запросов Claude, однако скачанный код боты не запускали. Исключением назван Gemini, который обращается через инфраструктуру Googlebot и страницу рендерит. Замер касается только площадок Vercel и потому служит ориентиром, а не универсальной статистикой. Масштаб зависимости от скриптов различается: в Web Almanac 2025 медианная разница в числе слов на странице до и после исполнения JavaScript составила 16–18%, причём чем больше текста на странице, тем меньше она полагается на рендеринг в браузере.
Механика подмены в описанной схеме опирается на правило в CDN: система ищет в User-Agent запроса подстроку из списка известных ботов и отдаёт совпавшим заранее подготовленный HTML, остальные получают обычную страницу. В тесте участвовали три страницы вымышленного сервиса учёта заявок по девять строк каждая. Первая рисовалась исключительно скриптом, и бот получил пустой HTML с нулевой похожестью и ни одной совпавшей строкой. На второй странице боту отдавался снимок из кэша со старой ценой и старой датой обновления. На третьей в копии для ботов появилась фраза о том, что это лучший сервис учёта заявок в России, которой обычный посетитель никогда не видел. Проверка велась на Python: человека изображал браузер Playwright с исполнением скриптов, бота — обычный HTTP-запрос без JavaScript с подставным User-Agent GPTBot.
Результаты показали, что процент совпадения плохо отражает риск для бизнеса. Страница со старым кэшем дала похожесть 97% и семь совпавших строк из девяти, при этом цена у бота составляла 4 500 рублей против 4 900 рублей у человека, а дата обновления — 1 сентября вместо 20 октября. Расхождение выявила только сверка чисел, а не сравнение текста целиком. Страница с лишней фразой получила более низкую похожесть в 92%, хотя все девять строк человека в копии присутствовали: добавочная строка с «независимой оценкой» отсутствовала на человеческой версии и могла быть пересказана нейросетью как объективный отраслевой обзор. Таким образом, версия с неверной ценой по метрике выглядит надёжнее версии с выдуманной оценкой, поскольку алгоритм сравнения считает долю совпавших символов, а в строке с ценой отличается всего одна цифра.
Юридический статус такой подмены остаётся неопределённым. Правило существует только у Google и касается Googlebot: пока рендер для бота даёт похожий контент, клоакингом его не считают. Для GPTBot, ClaudeBot и PerplexityBot явных правил ни у Google, ни у Яндекса найти не удалось, а высказывания Джона Мюллера про Markdown для ботов относятся к другому формату. Profound в документации утверждает, что Dynamic Bot Rendering не является клоакингом, поскольку отрендеренная страница совпадает с той, что браузер строит после JavaScript, однако это описание устройства продукта, а не гарантия идентичности конкретной копии. Версию в такой схеме выбирает подстрока в User-Agent, а содержимое рендера публикуется вручную, поэтому за совпадение копии с человеческой страницей отвечает владелец сайта, а не механизм доставки.
Для российского рынка вопрос особенно чувствителен: интернет-магазины и сервисы с динамическими ценами, скидками и остатками часто строят витрины на JavaScript, а аудитория всё активнее использует ИИ-ассистентов для сравнения товаров. Если бот получает кэш с устаревшей ценой, ответ нейросети может разойтись с реальным предложением, что создаёт риск претензий покупателей и репутационных издержек, причём владелец сайта узнает об ошибке не сразу, поскольку человеческая версия страницы остаётся в порядке. Отраслевые специалисты сходятся в том, что универсального стандарта для рендера под ИИ-краулеры пока нет, а значит, каждая площадка решает задачу самостоятельно и без внешнего контроля.
Наиболее надёжной альтернативой остаётся отказ от отдельной копии в пользу серверного рендеринга или статической генерации, которые Google сам называет предпочтительными, характеризуя динамический рендеринг как временный обход. Если копия всё же нужна, автор разбора предлагает три меры: запускать сверку на странице с ценой и затем закреплять её в CI, сравнивая числа и строки в обе стороны, а не долю похожести; задавать срок жизни кэша рендера и пересобирать копию при каждом изменении цены или даты; отличать настоящего бота по опубликованным IP-спискам, а не по User-Agent, который подставит любой скрипт. Открытым остаётся вопрос, появятся ли у крупных поисковых систем формальные правила для ИИ-краулеров и кто будет нести ответственность за устаревшую цифру в ответе нейросети — площадка, сервис рендеринга или сам ассистент.