coresmith.dev
Открытый код

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.

Где живёт

Исходный код и пакет

Запустили у себя и хотите, чтобы проблем не стало?