crawlview
Посмотрите, что поисковые системы и AI-краулеры на самом деле сохраняют с ваших страниц — а не то, что показывает браузер.
Браузер выполняет JavaScript, поэтому страница в DevTools — это готовая страница. Большинство краулеров его не выполняют. То, что сохраняют они, может быть пустым контейнером, и на экране об этом ничего не говорит.
crawlview запрашивает страницу по одному разу от имени каждого краулера, сравнивает ответы и показывает, где браузер и машины расходятся. Одна команда, без учётной записи, без установки.
Одна команда
npx crawlview https://example.com --renderНужен Node 20 или новее. Для сравнения с браузером используется уже установленный на машине Chrome — ничего не скачивается втихую.
Страница, которая отрисовывается в браузере и больше нигде
AGENT STATUS HTML TEXT TITLE DESC H1 CANON LD
Googlebot 200 870 B 0 w ok ok 0 ok 0
bingbot 200 870 B 0 w ok ok 0 ok 0
GPTBot 200 870 B 0 w ok ok 0 ok 0
ClaudeBot 200 870 B 0 w ok ok 0 ok 0
PerplexityBot 200 870 B 0 w ok ok 0 ok 0
browser (rendered) 200 15 KB 2,408 w ok ok 1 ok 1
x problems
2,408 words render in the browser; every crawler stores none of it.
Crawlers see no internal links at all.
Structured data is injected by JavaScript.Таблица — это отчёт. Фраза под ней — диагноз, и именно его обход сырого HTML дать не может.
Девять групп проверок
Расхождение
Что сохраняет каждый краулер против того, что отрисовывает браузер: текст, структурированные данные и внутренние ссылки, появляющиеся только после JavaScript — так целый сайт становится ненаходимым с собственной главной страницы.
robots.txt для каждого краулера
Разрешён ли каждому краулеру именно этот URL и какое правило это решило, включая Google-Extended и Applebot-Extended: токены, управляющие AI-ответами, но никогда ничего не запрашивающие — иначе их не увидеть никак.
Директивы индексации
Заголовки X-Robots-Tag, невидимые в исходном коде страницы и старше по приоритету, чем мета-тег. Забытый noindex в заголовке живёт месяцами, потому что туда никто не догадывается посмотреть.
Структурированные данные
Обязательные свойства и утверждения, которых сама страница не делает. Разметка вправе описывать только то, что видит посетитель; цена или телефон, существующие лишь в JSON-LD, — это то, за что выдают ручные санкции.
Заявленный язык против настоящего
Переведённый маршрут, отрисовывающий текст языка по умолчанию, заявляет один язык, а отдаёт другой. Признак — одинаковое количество слов во всех переводах, и сайт выглядит безупречно, пока кто-нибудь его не прочитает.
hreflang
Каждая альтернатива запрашивается и проверяется на обратную ссылку. Набор, в котором один участник не отвечает взаимностью, отбрасывается целиком — остальные переводы тоже теряют свои связи.
Готовность к AI-ответам
Получают ли что-нибудь краулеры, не выполняющие JavaScript, сколько текста переживает извлечение контента, дают ли заголовки пригодные разделы и можно ли страницу процитировать.
По всему сайту
Адреса из sitemap, отдающие 404, редирект, noindex или запрещённые; страницы, канонизирующие в другое место; страницы-сироты без единой ссылки; повторяющиеся заголовки; маршруты, которые втайне одна и та же страница.
Мягкие 404
URL, которого не может существовать, отвечающий 200 — то, что одностраничное приложение делает с каждой опечаткой в ссылке на вас.
Пусть падает сборка, а не квартал
Регрессию отрисовки обычно находят через недели, в Search Console, когда трафик уже ушёл. Это сбой сборки, который никто не настроил ловить.
crawlview завершается ненулевым кодом, когда краулер видит меньше заданной доли браузерного текста, а снимок, закоммиченный в репозиторий, превращает это в сравнение с последним заведомо рабочим запуском. Опубликованное GitHub Action подключает всё это к pull request.
Запустили у себя и хотите, чтобы проблем не стало?