Бот пришёл на сайт, сервер ответил 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-SearchBot | OpenAI | Сбор корпуса и индекс продукта | Берёт сырой HTML, скрипты могут не отработать | GPTBot, OAI-SearchBot |
| ChatGPT-User | OpenAI | Заход в момент диалога | Лимит времени, дорисовку не ждёт | ChatGPT-User |
| ClaudeBot, Claude-User | Anthropic | Обход и заход по запросу | Сырой HTML, одиночный запрос | Claude |
| PerplexityBot, Perplexity-User | Perplexity | Индекс и переход при ответе | Сырой HTML, живой запрос с лимитом | Perplexity |
| Google-Extended | Не краулер, а согласие на использование данных | Данные из индекса | В логах не встретится | |
| YandexBot | Яндекс | Индекс для ответов Яндекса | JS обрабатывается, но не гарантирован | YandexBot + проверка IP |
Поведение краулеров меняется без анонсов — поэтому колонка называется «на что рассчитывать», а не «рендерит: да/нет». Вопрос «кого пускать» — в статье про robots.txt для AI-ботов.
Googlebot и AI-краулер: разное отношение к JavaScript
Три пути нейросети до вашей страницы
Требования к 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-аудита; этого теста в типовых чек-листах нет.
Проверка за пятнадцать минут: четыре шага
Пустая страница — не всегда JavaScript
Прежде чем переделывать рендеринг, убедитесь, что дело в скриптах: пустой ответ боту часто дают защита от ботов, таймаут, редирект и баннер согласия, а это лечится другими средствами. Переписывать фронтенд там, где нужно поправить правило в файрволе, — дорого. Идти нужно по порядку: шаг либо закрывает диагноз, либо передаёт дальше.
%{time_total} на холодном кэшеОстальные симптомы, которые ловятся тем же способом:
| Симптом | Вероятная причина | Как проверить | Что делать |
|---|---|---|---|
| Вместо страницы проверочный экран | Капча или 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
Способ отдачи 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 включён — но доехал ли текст до первого ответа
Частичная стратегия: чинить не весь сайт
Когда переезд на серверный рендеринг невозможен, работает частичная стратегия: сделать доступными в 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-краулеры на ваших ключевых страницах, найдём блокировки и потерянный контент, подготовим требования для разработчиков.