Почему нейросети не видят контент на JavaScript

Краулеры ChatGPT, Claude и Perplexity забирают серверный HTML и не выполняют JavaScript.
Краулеры ChatGPT, Claude и Perplexity забирают серверный HTML и не выполняют JavaScript.

Как краулер модели читает страницу

Разница между поисковым роботом и краулером модели умещается в один этап, и от него зависит, попадете вы в ответ нейросети или нет.

Googlebot работает в два захода. Сначала скачивает HTML, который отдал сервер. Потом ставит страницу в очередь на отрисовку: отдельный сервис открывает ее в браузере без интерфейса, выполняет скрипты, дожидается ответов на внешние запросы и только после этого передает результат в индекс. Между первым и вторым заходом проходят часы, иногда дни. Но второй заход происходит.

У краулера модели второго захода нет. Один HTTP-запрос, чтение того, что пришло в ответ, переход к следующему адресу. Скрипты не выполняются, повторной попытки не будет.

Это измеряли. Vercel вместе с MERJ в декабре 2024 года разобрали трафик краулеров в своей сети и опубликовали исследование «The Rise of the AI Crawler». За месяц GPTBot сделал 569 миллионов запросов, ClaudeBot 370 миллионов, Applebot 314 миллионов, PerplexityBot 24,4 миллиона. Googlebot за тот же период 4,5 миллиарда. По рендерингу картина однозначная: крупные AI-краулеры скрипты не выполняют. GPTBot скачивал JS-файлы в 11,5% запросов, ClaudeBot в 23,84%, и ни один скачанный файл запущен не был.

Отрисовать страницу в браузере на порядки дороже, чем скачать текстовый файл. Google обходит сайты больше двадцати лет и отрисовку встроил в этот процесс постепенно, отдельным сервисом. У компаний, которые начали обходить сайты в 2023 году, такого запаса нет, а собрать надо весь доступный интернет. Выбор между «много страниц дешево» и «мало страниц дорого» делается в пользу первого.

Исключения есть, и все три подтверждаются документами. Gemini, по тому же исследованию Vercel и MERJ, работает на инфраструктуре Googlebot, и скрипты для него выполняются. Applebot страницы отрисовывает, это тоже данные Vercel. Bing в своих рекомендациях для вебмастеров пишет, что скрипты обрабатывать умеет, но с оговоркой про масштаб, и сам советует крупным сайтам отдавать боту заранее собранный HTML. Яндекс рендерит выборочно: по документации Вебмастера робот сам оценивает, что полезнее посетителю, версия со скриптами или без, и владелец сайта может переключить это поведение вручную.

Что бот получает вместо страницы: верстку интерфейса, меню, футер, пустой контейнер на месте основного текста и ссылки на скрипты. Иногда еще надпись «Загрузка». Дальше этот набор попадает в модель, и она делает вывод, что страница про меню и футер.

В статье о том, как попасть в ответы ChatGPT, рендеринг стоит третьим пунктом после доступа и индексации в Bing. Бьет он тише остальных: сайт открывается, страницы в поиске, разметка на месте, а цитат нет.

Одна и та же страница с включенным и отключенным JavaScript
Слева страница глазами человека, справа она же с отключенным JavaScript. Правый вариант и видит краулер модели.

Какой контент пропадает первым

Страница целиком пропадает редко. Из нее исчезают отдельные блоки, а владелец сайта этого не замечает: у него же в браузере все на месте. Поэтому проблема держится на сайтах годами. Ошибка 404 и медленная загрузка видны сразу, а пропавший для бота блок отзывов заметит только тот, кто открыл исходный код.

Вот что теряется чаще остального.

  • Каталог и карточки товаров, которые подгружаются при прокрутке. Первый экран отдается сразу, остальных позиций в исходном коде нет
  • Цены и наличие. Их часто тянут отдельным запросом к складу уже после отрисовки страницы, чтобы не показывать устаревшие цифры
  • Сторонний виджет с отзывами и рейтингом. Содержимое он собирает у себя на сервере и вставляет в страницу скриптом
  • Блоки вопросов и ответов внутри раскрывающихся элементов. Сам аккордеон тут ни при чем: текст может лежать в HTML в свернутом виде, а может подгружаться по клику
  • Содержимое вкладок: описание, характеристики, условия доставки. Тот же механизм, что у аккордеона
  • Текст под кнопкой «показать еще»
  • Разметка Schema.org в формате JSON-LD, которую вставляет скрипт после загрузки
  • Контент, который существует только внутри картинки или PDF

Когда JSON-LD появляется на странице после выполнения кода, для краулера модели его нет, а значит нет и всей структурированной информации о компании, товаре и авторе. Идеально собранная разметка при этом ничего не даст. Какие типы разметки вообще имеют смысл под цитирование, разбираем в статье про Schema.org для нейросетей.

Хуже всех дела у страниц, которые собираются целиком на скриптах: сервер отдает пустой контейнер, а содержимое рисуется уже в браузере. Теряется вся страница сразу. Такие сайты нормально выглядят и работают, но в корпусе, из которого нейросети берут ответы, их нет.

Так это выглядит на категорийной странице интернет-магазина: сервер отдает фильтры и хлебные крошки, а товары приходят отдельным запросом. Для покупателя страница с сотней позиций. Для краулера модели страница с четырьмя фильтрами.

Определить кандидатов на проверку можно и без кода, по поведению страницы. Блок в группе риска, если он появляется с задержкой, когда остальная страница уже отрисовалась. Еще один признак - серый прямоугольник с индикатором, который секунду висит на его месте при обновлении. Подозрительно содержимое, которое подтягивается по мере прокрутки. Отдельный случай - данные, которые приходят извне: курс валют, остатки со склада, отзывы с внешней площадки, расписание из системы бронирования. Все это признаки того, что блок собирает браузер, а не сервер.

Как проверить свой сайт за десять минут

Разработчик для этого не нужен. В десять минут укладываются первые две проверки, их хватает, чтобы понять, есть ли проблема. Остальные нужны, чтобы оценить масштаб.

Отключите скрипты в браузере. В Chrome для этого есть настройки сайта или расширение вроде Quick JavaScript Switcher. Откройте три страницы: главную, карточку услуги или товара, любую статью блога. Что осталось на экране, то и видит краулер модели. Смотрите на текст, а не на верстку: она поедет при любом раскладе. Бота интересуют слова.

Главная показывает, отдается ли вообще хоть что-то. В карточке услуги или товара смотрите коммерческую часть: цену, характеристики, отзывы. Статья блога - это то, ради чего вас и цитируют, и на ней же вылавливается точечный сбой: бывает, что сайт в порядке, а пустым отдается один шаблон из пяти.

Посмотрите исходный код. Ctrl+U в Windows, Cmd+Option+U в macOS, дальше поиск по странице. Найдите свой заголовок H1 и первое предложение основного текста. Если в коде их нет, а на экране текст есть, проблема подтвердилась.

Исходный код страницы, в котором нет основного текста
В исходном коде вместо текста пустой контейнер: забирать боту нечего.

То же самое одной строкой в терминале, если удобнее так: curl -s https://вашсайт.kz/stranica | grep 'фраза со страницы'. Вернулась строка, значит текст лежит в исходном HTML. Пусто, значит его туда добавляет браузер.

Сравните два обхода сайта. Screaming Frog работает в двух режимах: с выполнением скриптов и без. Прогоните оба, сопоставьте число найденных страниц и объем текста на них. Разрыв покажет масштаб: то ли пострадали три карточки, то ли весь каталог.

Сравнение обхода сайта с рендерингом JavaScript и без него
Два обхода одного сайта: с рендерингом находится весь контент, без рендеринга часть страниц оказывается пустой.

Владельцам сайтов с казахстанской и российской аудиторией пригодится Вебмастер Яндекса. В разделе индексирования есть отчет по рендерингу страниц с JavaScript, где содержимое показано в двух вариантах, с выполнением кода и без него. Из бесплатных инструментов это ближайшее к тому, что видит бот.

Последний способ - спросить саму модель. Дайте ChatGPT или Perplexity адрес страницы и попросите пересказать, что на ней написано. Если вместо конкретики модель выдает общий рассказ о том, чем занимается компания, до содержимого она не добралась. Этот способ самый быстрый и самый грубый: модель могла и не пойти по ссылке. Но если предыдущие проверки дали тревожный результат, а эта его подтвердила, сомнений не остается.

Проблему рендеринга легко спутать с закрытым доступом, а лечатся они по-разному. Если пустая страница возвращается и в браузере с отключенными скриптами, и через curl, дело в рендеринге. Если сервер отвечает кодом 403 или страница вообще не отдается конкретному боту, дело в доступе, и смотреть надо настройки для AI-краулеров.

Четыре способа отдать контент боту

Способов ровно четыре, а выбор между ними упирается в две вещи: как часто меняется содержимое и сколько у вас времени и денег. Идут они от самого надежного к самому быстрому.

Статическая генерация (SSG)

Страницы собираются заранее, на этапе сборки проекта, и лежат на сервере готовыми файлами. Бот получает полный HTML первым же запросом, ждать нечего.

  • Кому подходит: блог, каталог услуг, посадочные страницы, документация, любой сайт с содержимым, которое меняется раз в день или реже
  • Чего стоит: перестройка проекта под генератор. На Next.js, Nuxt или Astro это штатный режим, на самописном фронтенде потребуется работа
  • Где подводит: если данные обновляются каждый час, пересобирать сайт с той же частотой неудобно

Серверный рендеринг (SSR)

Сервер собирает готовую страницу под каждый запрос и отдает ее уже с текстом.

  • Кому подходит: магазины с меняющимися остатками и ценами, сервисы с личным кабинетом, площадки объявлений
  • Чего стоит: нагрузка на сервер и расходы на хостинг выше, чем у статики. Нужен разработчик, который умеет настраивать кеширование
  • Где подводит: неаккуратная реализация дает медленный ответ сервера, а такую страницу часть систем отбрасывает еще до чтения

Предварительный рендеринг для ботов (пререндер)

Отдельный сервис заранее прогоняет страницы через браузер, складывает готовый HTML в кеш и отдает его краулерам, пока люди получают обычную версию. Работает через Prerender.io или самостоятельно поднятый Rendertron.

  • Кому подходит: старый крупный проект, переписывать который дорого и долго, а видимость нужна в ближайший квартал
  • Чего стоит: подписка или собственный хостинг плюс настройка на стороне веб-сервера
  • Где подводит: кеш устаревает. Если версию для бота не обновлять, нейросети будут цитировать прошлогодние цены. Плюс появляется еще одна точка отказа: упал сервис пререндера, и боты снова видят пустоту

Вынос критичного текста в исходный HTML

Точечное решение без перестройки сайта: заголовки, первый абзац описания, характеристики, отзывы и разметку отдаете сразу, а интерфейс, фильтры и анимации оставляете на скриптах.

  • Кому подходит: сайт, где проблема ограничена парой блоков. Виджет отзывов меняется на серверную вставку, вкладки с характеристиками разворачиваются в обычный текст
  • Чего стоит: несколько дней работы, дешевле остальных вариантов
  • Где подводит: не спасает, если вся страница пустая

Комбинировать варианты нормально и часто дешевле, чем выбирать один. Статьи блога и посадочные страницы собираются заранее, карточки товаров рендерятся на сервере, личный кабинет остается полностью на скриптах, потому что боту там нечего делать. Не стоит только одного: ждать, когда сайт перепишут целиком. Пока идет разработка нового фронтенда, старый продолжает отдавать пустоту.

Соблазн отдавать боту одно, а человеку другое возникает у всех, кто настраивает пререндер. Позиция Google описана в документации: динамический рендеринг годится как обходной путь, но не как долгосрочное решение. Клоакингом он не считается, пока содержимое для бота и для человека совпадает по смыслу. Как только версии расходятся, начинается клоакинг со всеми последствиями для позиций. Пример из той же справки: страница про кошек людям и страница про собак краулерам. Между этими крайностями лежит серая зона, и заходить в нее не стоит.

Что делать на конструкторе и на готовой CMS

Если сайт собран на конструкторе или на готовой CMS, картина мягче.

Конструкторы и коробочные системы отдают текст в исходном HTML. Tilda, Wix, WordPress, Bitrix собирают страницу на сервере, и основное содержимое бот забирает без проблем. Уязвимое место одно: сторонние виджеты. Отзывы через внешний сервис, калькулятор стоимости, блок с ценами из CRM, формы записи, чат поддержки. Все это вставляет скрипт, и в исходном коде этих блоков нет. Проверять надо не сайт целиком, а конкретные блоки.

Лечится это без разработчика. Виджет отзывов остается на месте для посетителя. Рядом руками добавляется текстовый блок с теми же отзывами. Калькулятор работает как раньше, а под ним появляется абзац с базовыми ценами и логикой расчета. Повтор выглядит избыточным ровно до момента, когда исходный код сравнивают до и после.

Магазины на готовых платформах теряют цены и остатки. Механика та же, что в каталоге: платформа тянет их отдельным запросом после загрузки страницы. Покупатель этого не замечает, а нейросеть получает карточку товара без цены. То же с блоком отзывов и рейтингом. Потеря болезненная: нейросеть ведь и спрашивают о товаре затем, чтобы сравнить цены и посмотреть, что пишут в отзывах.

Собственная сборка на React, Vue или Angular без серверного рендеринга отдает пустую страницу целиком. Здесь без разработчика не обойтись, и разговор с ним стоит начинать не с вопроса «а можно ли», а с конкретной постановки.

Формулировка задачи для подрядчика, которую можно скопировать: «Основной контент страниц (H1, текст, характеристики, цены, отзывы, JSON-LD-разметка) должен присутствовать в HTML-ответе сервера до выполнения JavaScript. Проверка: curl по трем URL возвращает текст. Способ реализации на ваше усмотрение, приоритет SSG или SSR».

Если на сайте включен SSR или пререндер, в настройках рендеринга Вебмастера Яндекса стоит запретить выполнение скриптов: робот не будет тратить время на то, что вы уже отдаете готовым. Прямая рекомендация из справки Вебмастера, раздел «Индексирование страниц с JavaScript» - там же лежит и переключатель.

Ошибки, которые прячут контент даже на обычном сайте

Допустим, сайт не на фреймворке и конструктор отдает текст сразу. Потерять содержимое можно и без единой строчки React, способов пять.

Файлы стилей и скриптов, закрытые в robots.txt. Наследие старой оптимизации, когда экономили бюджет обхода. Googlebot без CSS и JS собирает страницу неправильно: видит текст поверх текста и нечитаемый шрифт на мобильном, а следом занижает оценку. Откройте robots.txt и уберите запреты на директории со стилями и скриптами. Строчки вида Disallow: /wp-includes/ или Disallow: /assets/ до сих пор встречаются в конфигурациях, которые никто не пересматривал с 2018 года.

Бывает и так, что важный текст существует только внутри картинки: меню ресторана одним JPEG, прайс скриншотом из таблицы. Модель обрабатывает текст, а картинку получает только ссылкой и альтернативным описанием. Все, что нарисовано, для нее не существует. Остается атрибут alt, куда влезает одно предложение, а не прайс на сорок позиций.

Основной материал в PDF без текстовой версии на странице. Исследования, каталоги, технические характеристики, инструкции. PDF индексируется и цитируется хуже, чем HTML: часть систем такие файлы не открывает вовсе, часть открывает, но теряет структуру. Выкладывайте файл для скачивания и дублируйте суть текстом на самой странице, хотя бы в объеме содержания и выводов.

Часть содержимого появляется только после действия пользователя: клик по вкладке, прокрутка до блока, разворот аккордеона, переключение галереи. Бот ничего не нажимает и страницу не прокручивает. Проверка та же: поищите фрагмент в исходном коде. Текст нашелся, значит он в HTML и свернут стилями, это безопасно.

Разметка, которую вставляет Google Tag Manager. Способ выглядит удобно: маркетолог правит JSON-LD без разработчика. Но GTM это скрипт, и разметка появляется после его выполнения. Google ее в итоге увидит, краулер модели нет. Разметку кладите в код страницы.

Что происходит после исправления

Порядок событий один, и сократить его нельзя. Сначала бот переобходит страницы, потом обновляется индекс, а за ним появляются цитаты. Ускорить можно первый шаг: отправьте страницы на переобход через Search Console и панель Bing. Середина зависит от расписания систем.

Скорость первого шага зависит от того, как часто боты вообще ходят к вашему сайту: у одного проекта это дни, у другого недели. Цитаты появляются заметно позже переобхода, потому что между ними стоит обновление индекса. На горизонте одной недели изменений не будет, и это нормально.

До правки зафиксируйте исходную точку. Возьмите десять-пятнадцать запросов, по которым хотите попадать в ответы, прогоните их через ChatGPT, Perplexity, Алису и Gemini, сохраните ответы: упомянули вас или нет, что процитировали вместо вас. Без этого замера через месяц вы не отличите результат работы от случайных колебаний. Как строить такой замер по шагам, показываем в статье про измерение видимости в нейросетях.

Через месяц вернитесь к замеру: визиты GPTBot и PerplexityBot в логах сервера, число проиндексированных страниц в панели Bing, повтор того же набора запросов. Логи важнее остального: они показывают, дошел ли бот до исправленных страниц вообще. Пока в логах пусто, обсуждать содержимое рано.

Если краулеры ходят, страницы в индексе, а цитат нет, дело уже не в рендеринге. Дальше смотрят на другое: пригоден ли ваш текст для цитирования и хватает ли сайту авторитета. Начинать стоит с индексации в Bing: через нее ChatGPT находит большую часть источников.

Коротко

  • Крупные AI-краулеры скрипты не выполняют: по данным Vercel и MERJ за декабрь 2024 года GPTBot скачивал JS-файлы в 11,5% запросов, ClaudeBot в 23,84%, но ни один скачанный файл не запустили
  • Отрисовку делают Googlebot, Gemini на его инфраструктуре и Applebot, частично Bing, выборочно Яндекс. Остальные читают то, что вернул сервер
  • Хорошие позиции в Google ничего не говорят о видимости в нейросетях: Google рендерит страницу вторым заходом, краулер модели ограничивается первым
  • Первая проверка занимает десять минут: браузер с отключенными скриптами и поиск заголовка в исходном коде. Масштаб потерь покажут два обхода в Screaming Frog, с рендерингом и без
  • Решений четыре: статическая генерация, серверный рендеринг, пререндер для ботов, вынос критичного текста в исходный HTML. Выбор зависит от того, как часто меняются данные и сколько есть времени и денег
  • Разметка Schema.org, вставленная скриптом, для краулера модели не существует, каким бы правильным ни был JSON-LD

Об авторе

Марат Аксанов, сооснователь GEO-агентства HITZ. Двенадцать лет в маркетинге и медиа, из них последние годы в поиске и генеративных системах.

Об агентстве

HITZ помогает брендам появляться в ответах ChatGPT, Gemini, Perplexity и Алисы. Работаем с бизнесом в Казахстане и Узбекистане: технический аудит под AI-краулеры, разметка, контент под цитирование, замеры видимости. Что входит в работу и как она устроена, описано на странице GEO-продвижения.

Частые вопросы

Сайт нормально ранжируется в Google, значит ли это, что с рендерингом все хорошо?

Нет, одно из другого не следует. Googlebot отрисовывает страницу вторым заходом, через отдельный сервис рендеринга, и до содержимого добирается. Краулеры ChatGPT, Perplexity и Claude берут HTML в том виде, в каком его отдал сервер. Сайт может стабильно занимать первую страницу выдачи и при этом отсутствовать в источниках, из которых нейросети собирают ответы.

Нужно ли переписывать сайт целиком?

Чаще нет. Полная перестройка требуется, когда сервер отдает пустой контейнер и вся страница рисуется в браузере. Если пропадают цены, отзывы или характеристики во вкладках, хватит точечного выноса этих блоков в исходный HTML. Начните с проверки: отключите скрипты и посмотрите, что осталось. От того, сколько потерялось, зависит и объем работ.

Помогает ли пререндер или это обман поисковика?

Помогает, и обманом не считается, пока версия для бота совпадает по содержанию с тем, что видит человек. В документации Google динамический рендеринг назван обходным путем, а не долгосрочным решением, и к клоакингу его там не относят. Расхождение версий превращает его в клоакинг. Главный риск на практике другой: устаревший кеш, из которого боты забирают прошлогодние данные.

Отзывы стоят виджетом. Их видят нейросети?

Чаще нет: сторонние виджеты собирают содержимое на своем сервере и вставляют его в страницу скриптом, поэтому в исходном коде отзывов не оказывается. Проверка занимает минуту: откройте код страницы и поищите фрагмент любого отзыва. Если поиск ничего не дал, для краулера модели отзывов нет. Решение: попросить разработчика выводить текст отзывов серверной вставкой, а виджет оставить ради оценок и сортировки.

Что дороже: серверный рендеринг или вынос текста в исходный код?

Серверный рендеринг дороже на всех этапах. Он заставляет перестроить проект и занять разработчика на недели, а постоянная нагрузка на сервер поднимает счет за хостинг. Вынос критичного текста в HTML занимает несколько дней и обходится в разы дешевле. При этом второй вариант закрывает проблему частично: он спасает, когда теряются блоки, и бесполезен, когда сервер отдает пустую страницу.

Как объяснить задачу разработчику, если я не технический специалист?

Дайте формулировку и способ проверки, а реализацию оставьте на его усмотрение. Текст задачи: основной контент страниц, то есть заголовок H1, основной текст, характеристики, цены, отзывы и JSON-LD-разметка, должен присутствовать в HTML-ответе сервера до выполнения JavaScript. Приемка: команда curl по трем адресам возвращает текст этих блоков. Такая постановка не навязывает подрядчику технологию и при этом не оставляет места для трактовок.

Обсудить проект
+7 706 624 20 40