Бот пришёл на сайт, сервер ответил 200 — а в ответах нейросети страницы как не было, так и нет. Причина часто не в текстах: сервер отдал каркас, а ценное дорисовывается скриптами уже в браузере. Googlebot такой сайт обычно разберёт, а краулер нейросети, как правило, нет: один запрос, что пришло, то и забрали. Разберём, как проверить сайт самому за пятнадцать минут, почему пустая страница у бота часто оказывается не JavaScript и что делать, если переписывать фронтенд не на что.

JS-слепота: почему часть сайта для бота не существует

JS-слепота — это ситуация, когда бот забирает у сервера только исходный HTML-ответ и не выполняет JavaScript, поэтому весь контент, который дорисовывается в браузере посетителя, для него просто не существует. У страницы есть два состояния: бот видит первое, вы смотрите на второе.

Сервер отвечает HTML-документом, браузер выполняет скрипты, те идут за данными — цена, наличие, отзывы, филиалы — и вставляют их в разметку. Бот останавливается на первом шаге и получает шапку, подвал и пустые контейнеры: ответ 200, страница «отдана», смысла в ней нет.

Универсальной доли потерь тут не бывает: где-то на клиенте живёт только блок отзывов, где-то скриптами собирается вся страница вместе с заголовком. Ответ на вопрос «сколько у нас невидимо» даёт только замер на своём сайте.

⚠️

Здесь про один узкий вопрос: доезжает ли байт с вашим контентом до модели. Чек-лист техоптимизации и определения способов рендеринга — в материале про техническое SEO, тут разворачивается один его пункт. Что писать, чтобы цитировали, — в гайде по ответам нейросетей. И отдельно: медленный сайт и невидимый — разные болезни, скорость разбирается в статье про ускорение сайта.

Googlebot: рендеринг есть, но с отсрочкой

Googlebot умеет выполнять JavaScript: он ставит страницу в очередь на рендеринг в headless-браузере и возвращается позже, поэтому SPA в индекс Google обычно попадает — просто позже и не всегда целиком. Именно это отличие годами маскировало проблему.

Работа поисковика с JavaScript разбита на два этапа: обход, где робот скачивает исходный HTML и вытаскивает ссылки, и рендеринг, где страница открывается в браузерном движке. Между этапами проходит время, и сколько именно — Google не гарантирует. Отвалился запрос к API в момент отрисовки — в индекс попадёт то, что успело собраться.

Как страница попадает в индекс, разбирали в статье про индексацию сайта; здесь важен контраст: в индексе Google страница есть, а в ответе ChatGPT её нет. Яндекс JavaScript тоже обрабатывает, но полагаться на это как на данность не стоит — как и на то, что мобильный агент увидит то же самое (мобильное SEO).

Чем AI-краулер отличается от поисковика

AI-краулеры устроены проще поисковых: они делают один HTTP-запрос, забирают то, что сервер отдал сразу, и уходят — очереди на повторный рендеринг в браузерном движке у них, как правило, нет.

АгентЧейЗачем ходитНа что рассчитывать по JSКак найти в логах
GPTBot, OAI-SearchBotOpenAIСбор корпуса и индекс продуктаБерёт сырой HTML, скрипты могут не отработатьGPTBot, OAI-SearchBot
ChatGPT-UserOpenAIЗаход в момент диалогаЛимит времени, дорисовку не ждётChatGPT-User
ClaudeBot, Claude-UserAnthropicОбход и заход по запросуСырой HTML, одиночный запросClaude
PerplexityBot, Perplexity-UserPerplexityИндекс и переход при ответеСырой HTML, живой запрос с лимитомPerplexity
Google-ExtendedGoogleНе краулер, а согласие на использование данныхДанные из индексаВ логах не встретится
YandexBotЯндексИндекс для ответов ЯндексаJS обрабатывается, но не гарантированYandexBot + проверка IP

Поведение краулеров меняется без анонсов — поэтому колонка называется «на что рассчитывать», а не «рендерит: да/нет». Вопрос «кого пускать» — в статье про robots.txt для AI-ботов.

Googlebot и AI-краулер: разное отношение к JavaScript

Слева Googlebot: скачивает исходный HTML, ставит страницу в очередь на рендеринг, возвращается позже — срок не гарантирован, поэтому SPA обычно попадает в индекс. Справа AI-краулер: один HTTP-запрос, забирает отданное сразу, очереди на повторный рендеринг у него, как правило, нет.GooglebotРабота разбита на два этапа: обход и рендерингСкачивает исходный HTML и вытаскивает ссылкиСтавит страницу в очередь на рендеринг вheadless-браузереВозвращается позже: срок Google не гарантируетSPA обычно попадает в индекс — позже и невсегда целикомAI-краулерДелает один HTTP-запросЗабирает то, что сервер отдал сразу, и уходитОчереди на повторный рендеринг, как правило,нетБерёт сырой HTML: скрипты могут не отработатьУ живого захода в диалоге ещё и лимит времени
Сравнение. Почему страница может быть в индексе Google и при этом пустой для краулера нейросети.

Три пути нейросети до вашей страницы

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

Сами сценарии обхода разобраны в статьях про robots.txt для AI-ботов и мониторинг AI-трафика — пересказывать не будем. Здесь важно другое: что каждый путь требует от вашего HTML.

ПутьЧто читает ботЧто обязано быть в ответе сервераЧем это не лечится
Обучающий обходСырой HTML одного запросаВесь смысловой текст и факты сразуРазметкой: нет текста — нечего описывать
Через индекс поисковикаРезультат рендеринга GooglebotКорректная индексацияНа другие каналы не переносится
Живой запрос в диалогеСырой HTML, лимит времени короткийБыстрый ответ и готовый текст в телеТяжёлой генерацией и подгрузкой блоков

Главный вывод: видимость расслаивается по каналам. Страница может работать в обзорах Google — туда она попадает через индекс, где JavaScript уже выполнен, — и быть пустой для ChatGPT или Perplexity, читающих сырой ответ. Поэтому вопрос «видят ли нас нейросети» некорректен. Правильный: какие именно и по какому пути.

Проверка за пятнадцать минут

Проверка сводится к сравнению двух текстов — того, что сервер отдаёт в исходном HTML, и того, что видно в браузере после скриптов: если ключевого блока нет в первом, его нет и для ботов, которые скрипты не выполняют.

Шаг 1. Исходный код, а не панель разработчика. «Просмотр кода страницы» (Ctrl+U) показывает отданное сервером, а «Инспектор» — отрисованный DOM. Здесь ошибаются чаще всего.

Шаг 2. Запросить страницу так, как это делает бот. curl есть в macOS и Linux, в Windows — в PowerShell или WSL.

что отдаёт сервер до выполнения скриптов терминал
curl -s -A "Mozilla/5.0 (compatible; GPTBot/1.0)" 
  https://example.ru/uslugi/ -o raw.html

wc -c raw.html                # объём ответа в байтах
grep -o "от 45 000" raw.html  # ищем цену
grep -c "<h2" raw.html        # сколько заголовков
grep -c "<a href" raw.html    # сколько настоящих ссылок

Шаг 3. Отключить JavaScript для домена и перезагрузить страницу — увидите то же, что краулер. Шаг 4. Сравнить объём: экран, полный текста, против ответа, где почти нет слов.

Что искать в сыром HTML

  • Текст H1 и подзаголовков — именно текст, а не пустой контейнер.
  • Цена или цифра: «от 45 000», «в наличии», срок.
  • Первый абзац FAQ и состав услуги из вкладки.
  • Пункты меню — не слова, а теги a с href.

Остальное закрывает общий чек-лист SEO-аудита; этого теста в типовых чек-листах нет.

Проверка за пятнадцать минут: четыре шага

Четыре шага проверки: открыть просмотр исходного кода, а не инспектор; запросить страницу через curl с User-Agent бота; отключить JavaScript для домена и перезагрузить; сравнить объём и контрольные фрагменты — цену, заголовки, ссылки с href.1Открытьисходный кодстраницыCtrl+U, а неинспектор: онпоказывает готовыйDOM2Запроситьстраницу как ботcurl с User-Agentкраулера, ответсохранить в файл3ОтключитьJavaScriptдля домена иперезагрузить —увидите то же, чтокраулер4Сравнить объёми фрагментыцена, заголовки,ссылки с href, первыйабзац FAQ
Порядок работ. Как самому сравнить то, что отдаёт сервер, с тем, что видно в браузере после скриптов.

Пустая страница — не всегда JavaScript

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

шаг 1Код ответа. Запросить URL с ботовским User-Agent
403 / 429Блокировка, а не рендеринг: антибот, прокси, правило в WAF. SSR не поможет
шаг 2Время ответа. Замерить %{time_total} на холодном кэше
долгоЖивой заход не дождётся. Лечится серверным кэшем, а не фронтендом
шаг 3Маршрут. Проследить цепочку редиректов до конечного URL
не та страницаРедирект по гео или языку увёл бота на заглушку
шаг 4Тело ответа. Объём и контрольные фрагменты
диагнозКод 200, тело маленькое и одинаковое на всех URL — это JS-слепота

Остальные симптомы, которые ловятся тем же способом:

СимптомВероятная причинаКак проверитьЧто делать
Вместо страницы проверочный экранКапча или JS-challengeВ ответе текст проверки, не контентОтключить challenge для агентов
В ответе только баннер cookieКонтент грузится после клика по согласиюОтключить JS: под баннером пустоОтдавать контент сразу, баннер поверх
Агента нет в логахЗакрыт в robots.txtОткрыть /robots.txt, найти User-AgentСм. robots.txt для AI-ботов
200 с телом-заглушкойПустой контейнер и бандлwc -c: объём мал и одинаков вездеЭто действительно JS-слепота

Постоянный учёт обращений — в статье про мониторинг AI-трафика.

Что теряется при клиентском рендеринге

Первым делом пропадает не оформление, а факты: цена, наличие, характеристики, отзывы, ответы на вопросы, контакты и меню — то, ради чего модель могла бы на вас сослаться.

ЭлементКак реализованЧто видит ботПоследствие
H1 и подзаголовкиПодставляются компонентомПустой контейнерСтраница без темы
Цена и наличиеОтдельный запрос к API«Загрузка…»В товарных ответах не назовут: GEO для магазина
ОтзывыСторонний виджет или iframeПустой блок и чужой скриптСоциальных доказательств нет
FAQАккордеон с подгрузкойТолько вопросыТеряется цитируемый формат
Крошки и менюПереходы на обработчиках кликаТекст без адресовБот не доходит до соседних страниц

Последняя строка дороже прочих: бот не узнал об остальных страницах. Вся внутренняя перелинковка для него пуста: ссылка существует, только если есть тег a с href.

Что должно быть в первом HTML-ответе

В ответе сервера, до выполнения скриптов, должны быть: title и H1, основной текст, цена или ключевой факт, ответы на частые вопросы, контакты, навигация тегами a с href и структурированная разметка. Список можно отдать подрядчику как требование.

  • Title, description и canonical в head — не подставляемые роутером.
  • H1 и подзаголовки. Заголовок задаёт тему фрагмента, который модель вырежет.
  • Смысловой текст целиком, не аннотация и не первые абзацы.
  • Ключевой факт: цена, срок, состав услуги, гарантия — цитируется охотнее рассуждений.
  • Ответы на частые вопросы: вопрос подзаголовком, ответ — коротким абзацем под ним.
  • Контакты и адреса текстом, а не только метками на карте.
  • Навигация ссылками: меню, крошки, пагинация, карточки.
  • Schema в исходном ответе, а не вставленная скриптом: типы — в статье про Schema под нейросети.
💡

Формулировка для техзадания. «Весь смысловой текст страницы — заголовки, цены, характеристики, ответы на вопросы, контакты и разметка — присутствует в HTML-ответе сервера до выполнения JavaScript. Навигационные ссылки реализованы тегом a с href. Критерий приёмки: curl возвращает документ с контрольными фрагментами».

Что должно быть в HTML до выполнения скриптов

Слева требования к первому HTML-ответу: title и canonical, H1 текстом, смысловой текст целиком, ключевой факт, контакты, навигация тегами a с href. Справа то, чего бот не увидит: заголовок из компонента, цена отдельным запросом, отзывы в iframe, FAQ-аккордеон, меню на обработчиках клика.Есть в ответе сервераTitle, description и canonical в headH1 и подзаголовки текстом, а не пустойконтейнерСмысловой текст целиком, а не первые абзацыКлючевой факт: цена, срок, состав услуги,гарантияКонтакты и адреса текстом, а не метками накартеНавигация тегами a с href: меню, крошки,пагинацияДорисовывается скриптамиЗаголовок подставляет компонент — у ботапустой контейнерЦена и наличие отдельным запросом к API —«Загрузка…»Отзывы в стороннем виджете или iframeFAQ-аккордеон с подгрузкой: остаются тольковопросыМеню на обработчиках клика — текст безадресов
Сравнение. Что обязано быть в ответе сервера и какие элементы чаще всего дорисовываются скриптами уже в браузере.

Как выбрать способ отдачи HTML

Способ отдачи HTML выбирают по одному параметру — как часто меняется содержимое страницы: чем чаще, тем ближе к моменту запроса должна происходить сборка и тем дороже обходится инфраструктура.

Что такое SSR, SSG и гидратация — в чек-листе по техническому SEO; определения не повторяем. Вопрос другой: что брать под свой тип контента, чем вы платите и где вариант всё-таки подведёт бота.

Как часто меняется контентЧто обычно берутЧем платитеГде подводит бота
Реже раза в неделю: услуги, посадочные, блогПредсборку страниц в готовые файлыВыкладкой на каждую правку текстаПочти нигде, если правки доезжают до продакшена
Раз в сутки или по событию: большой каталогПересборку по расписанию или вебхукуОкном неактуальности между сборкамиБот забирает HTML с прошлой ценой
В момент запроса: остатки, цена, условияСборку на сервере плюс кэшПроцессом, кэшем, нагрузкойДолгий ответ на холодном кэше
Фронтенд трогать нельзяПрослойку со снимками страниц для ботовЕщё одним сервисом в цепочкеСнимки устаревают, прослойка падает

Чаще всего правильный ответ — гибрид: текст, факты и ссылки приезжают с сервера, а фильтры и корзина живут на клиенте. Платите вы тут дисциплиной команды: на любом релизе блок может незаметно «уехать» на клиент. Перенос отрисовки на сервер обычно улучшает и пользовательские метрики — см. про Core Web Vitals.

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

⚠️

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

SSR включён, а бот видит каркас

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

Что происходитКак выглядитКак пойматьЧто делать
Контент вставляется при гидрацииSSR формально включён, в сыром ответе пустой контейнерФрагмент есть в браузере и отсутствует в curlЗабирать данные на сервере, а не после монтирования
Потоковая отдача ответаПервый кусок быстрый, смысловая часть — следомВ сохранённом ответе «скелетон» вместо текстаДержать ключевой текст в первом куске
Кэш на периметре или CDNБоту достаётся вариант для другого случаяОдин URL отдаёт разный объём тела разным агентамНе варьировать кэш по User-Agent вслепую
SSR только на части шаблоновГлавная в порядке, карточки и статьи пустыеПроверен один URL вместо одного URL каждого типаПрогонять тест по образцу каждого шаблона
Персонализация или A/B на сервереБоту приходит вариант без контентаПовторные запросы дают разные тела ответаЗадать нейтральный вариант по умолчанию

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

Плюс приёмы SPA, переживающие включение SSR:

  • Ленивая подгрузка и бесконечный скролл. В HTML первые позиции, остальное приезжает при прокрутке, а бот не прокручивает. Лечение — страничная навигация ссылками и свой URL у фильтрованной выдачи: см. про структуру каталога и фильтры.
  • Вкладки, аккордеоны и модальные окна. Скрыто стилями, но лежит в HTML — есть. Загружается по клику — нет. Условия, гарантии и прайс чаще всего прячутся именно так.
  • Виджеты через iframe. Отзывы, карта, калькулятор живут на чужом домене и в ваш HTML не попадают. Дублируйте факты текстом рядом — это полезно и людям, см. про юзабилити.

SSR включён — но доехал ли текст до первого ответа

Вопрос: фрагмент виден в браузере, но отсутствует в ответе curl? Если да — рендеринг до контента не доехал: гидрация, потоковая отдача, кэш на периметре или SSR только на части шаблонов. Если нет — текст в первом ответе есть, но тест нужно прогнать по одному URL каждого шаблона.Фрагмент есть в браузере, но не в ответе curl?ДАРендеринг до контента не доехалгидрация, потоковая отдача, кэш на периметре, частьшаблоновНЕТТекст в первом ответе естьпрогоните тест по одному URL каждого шаблона
Схема. Проверка после включения серверного рендеринга: контрольный фрагмент сверяют в браузере и в ответе curl.

Частичная стратегия: чинить не весь сайт

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

  • Приоритизация. Не чините весь сайт: возьмите десять–двадцать страниц, отвечающих на вопросы аудитории.
  • Статический блок с фактами: «стоимость от», состав услуги списком, несколько вопросов с ответами, адрес и телефон — интерактивная версия может жить рядом.
  • Разгрузить вкладки и модалки: вкладки сделать секциями, важные поп-апы — отдельными страницами. Часто самая дешёвая правка.
  • Пререндер-прослойка — не на весь сайт, а на список URL: меньше рисков, проще откатить.
  • Вспомогательное: карта сайта, страницы-хабы со статическим текстом, llms.txt как указатель.
⚠️

llms.txt, разметка и тег noscript не заменяют доступный HTML. Файл-указатель — оглавление: подскажет, куда идти, но если по адресу пустой контейнер, ничего не изменится. Разметка описывает контент, а не подменяет его. А noscript бесполезен, если внутри пусто.

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

Как убедиться, что починилось

Проверка результата — тот же curl-тест до и после плюс серверные логи: вырос ли объём HTML, который вы отдаёте ботам, и появились ли контрольные фрагменты.

Уровень 1. Повторить процедуру. Прогоните тот же список фрагментов по тем же URL и сведите в таблицу: страница, размер до и после, что нашлось.

сравнение ответа для разных агентов терминал
URL="https://example.ru/uslugi/"

for UA in "Mozilla/5.0" "GPTBot/1.0" "ClaudeBot/1.0" "PerplexityBot/1.0"; do
  CODE=$(curl -s -o body.html -w "%{http_code}" -A "$UA" "$URL")
  SIZE=$(wc -c < body.html)
  HAS=$(grep -c "Гарантия 12 месяцев" body.html)
  echo "$UA код $CODE, $SIZE байт, фрагмент: $HAS"
done

Разные коды у браузерного и ботовского агента — это блокировка, а не рендеринг; одинаково малые размеры — рендеринг не включился.

Уровень 2. Логи сервера. По каждому AI-агенту смотрите коды ответов, размер тела и время ответа: рост среднего размера тела показывает, что починка доехала до продакшена.

Уровень 3. Поведенческая проверка. Задайте моделям вопросы, ответ на которые есть только у вас на странице. Результат нестабилен: зависит от формулировки, версии модели и того, ходил ли движок в интернет. Это индикатор, а не метрика — методика замера в статье про мониторинг бренда.

Типичные ошибки

Самая частая ошибка — проверять сайт глазами в браузере и делать вывод «всё видно», хотя браузер показывает результат работы скриптов, а бот его не увидит. Ниже симптомы, каждый проверяется за минуту.

  • Судить по панели разработчика: инспектор показывает отрисованный DOM, нужен просмотр кода или curl.
  • Считать, что раз сайт в индексе Google, его видят все ИИ: индекс — лишь один из трёх путей.
  • Переписывать фронтенд, не проверив коды ответа: при 403 никакой SSR не поможет.
  • Закрывать задачу сразу после включения SSR: гидрация, потоковая отдача и кэш на периметре оставляют бота с каркасом.
  • Забыть про окно неактуальности: человеку цену дорисовывает скрипт, а бот цитирует вмёрзшую в HTML с прошлой сборки.
  • Меню на обработчиках клика вместо ссылок: нет a href — для бота переходов не существует.
  • Отдавать боту версию, отличающуюся по смыслу. Способ доставки — да, содержание — нет. Иначе клоакинг.
  • Потерять серверный рендеринг при редизайне: проверять HTML нужно до выката — см. про редизайн без потери позиций.

Что в итоге

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

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

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

И рамка ожиданий: доступный HTML — входной билет, а не гарантия попадания в ответы. Дальше начинается содержание — за этим в гайд по ответам нейросетей и в материал про продвижение бренда в нейросетях.

Не уверены, что нейросети видят ваш сайт?

Проверим, что получают AI-краулеры на ваших ключевых страницах, найдём блокировки и потерянный контент, подготовим требования для разработчиков.

Получить бесплатный аудит