Глазами робота

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

Один запрос к странице и один к её robots.txt. Ничего не сохраняется.

Или попробуйте wikipedia.org, react.dev

У каждой страницы две копии

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

Боты в основном работают с первой. Googlebot действительно отрисовывает страницы в Chrome без интерфейса, но на отдельном, более позднем этапе, который может запаздывать и обрываться по тайм-ауту. Bingbot отрисовывает меньше. Роботы, которые собирают данные для ИИ-ассистентов, и сборщики превью в мессенджерах и соцсетях, как правило, вообще не выполняют JavaScript. Если ваш текст есть только во второй копии, значительная часть вашей машинной аудитории получает пустую страницу.

Эта проверка запрашивает первую копию и на этом останавливается. Ничего не выполняется, никакие стили не применяются.

Как читать текстовый вид

Мы проходим тело страницы в порядке исходного кода и выводим его как текст. Скрипты, стили, шаблоны и встроенные SVG-рисунки пропускаются. Остальное помечено так:

#, ##, ###
Заголовок и его уровень. Попробуйте прочитать только эти строки. Они должны работать как оглавление страницы.
Подчёркнутые слова
Ссылка. Наведите на неё курсор, чтобы увидеть адрес, куда она ведёт.
[Image: …]
Текст alt изображения. Изображение без атрибута alt показано как отсутствующее, с именем файла. Кнопки и поля форм так же выводятся в скобках.
Текст, помеченный как скрытый
Слова, которые есть в HTML, но имеют атрибут hidden или встроенный стиль вроде display:none, visibility:hidden, font-size:0 или большой отрицательный text-indent.
Текст, помеченный noscript
Содержимое внутри <noscript>, которое получают только боты и посетители без JavaScript.

Под текстом приведены цифры: размер HTML, число видимых слов, доля текста в HTML, скрипты, ссылки и изображения. Доля текста от 10 до 30% типична для страницы, сделанной вручную или на CMS. При 1 или 2% документ состоит в основном из кода.

Что вызывает каждую находку

НаходкаПрименяемое правило
Содержимое только после JavaScriptМеньше 60 видимых слов вместе с одним из признаков: пустой контейнер приложения (#root, #app, #__next, #__nuxt, app-root и подобные), три или больше внешних скриптов, больше 50 KB встроенного скрипта или больше 150 KB в основных файлах скриптов.
Очень мало текстаМеньше 150 видимых слов.
Страница просит не индексировать еёnoindex или none в метатеге robots или заголовке X-Robots-Tag.
Google не допущенПуть страницы попадает под правило Disallow для Googlebot в robots.txt.
Скрытого текста больше, чем видимогоСкрытых слов больше, чем видимых, при минимуме 80.
Ссылки, по которым боты не могут пройтиhref="#", href="javascript:…" или onclick без href.
Нет заголовка первого уровня, изображения без altПодсчитывается прямо в HTML.

Последний блок применяет ваш robots.txt к этому адресу для десяти роботов: Googlebot, Bingbot, Google-Extended, GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, CCBot и Applebot-Extended. Блокировка Googlebot считается ошибкой. Блокировка ИИ-робота просто отмечается: это ваш законный выбор. Проверка доступа ИИ-ботов охватывает более длинный список для всего сайта.

Как поместить текст в первую копию

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

  1. Рендеринг на сервере. Next.js, Nuxt, SvelteKit, Remix и Angular умеют выдавать полный HTML на каждый запрос и потом подключать к нему скрипты. Обычно это вопрос настройки, а не переписывания.
  2. Генерация статических страниц при сборке. Для редко меняющегося содержимого такие инструменты, как Astro, Gatsby или статический экспорт упомянутых фреймворков, создают полный HTML-файл для каждой страницы.
  3. Пререндеринг для ботов. Сервис пререндеринга хранит отрисованный снимок и отдаёт его роботам. Это работает, но теперь вам нужно следить за двумя версиями.

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

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

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

Выполняет ли Google JavaScript при обходе страницы?

Да, но вторым шагом. Сначала Google индексирует скачанный HTML, затем ставит страницу в очередь на отрисовку в Chrome без интерфейса. Этот шаг может наступить позже, и он может не дождаться медленных скриптов или содержимого, которое подгружается при прокрутке или клике.

Выполняют ли JavaScript роботы ChatGPT, Claude и Perplexity?

Как правило, нет. GPTBot, ClaudeBot, PerplexityBot и CCBot скачивают HTML и читают его текст. Страница, которой нужны скрипты, чтобы показать содержимое, даёт им мало или ничего.

Вредит ли скрытый текст SEO?

Нет, если он часть интерфейса. Меню, вкладки, аккордеоны и диалоги индексируются нормально. Спамом поисковые системы считают текст, намеренно скрытый от посетителей ради ключевых слов, например белый текст на белом фоне.

Какое соотношение текста и HTML считается хорошим?

Целевого значения нет, и это не фактор ранжирования. Аккуратно сделанные страницы часто укладываются в 10–30%. Очень низкая цифра лишь намекает, что для такого объёма содержимого в документе много разметки или встроенных скриптов.

Почему для моего сайта вид почти пустой?

Ваш сервер отдаёт оболочку приложения, а содержимое добавляется в браузере. Откройте исходный код страницы (Ctrl+U или Cmd+Option+U) и найдите фразу со своей страницы. Если её там нет, боты, которые пропускают JavaScript, её тоже не видят.