クローラー視点

ほとんどのボットはページを描画しません。サーバーが送るHTMLを受け取り、文字だけを拾って去っていきます。このチェックは、ボットが出会う順番でその文字を表示し、足りないものを指摘します。

ページに1回、robots.txtに1回のリクエストを送ります。どちらも保存しません。

例: wikipedia.org, react.dev

どのページにも2つの姿がある

1つ目は、サーバーから出ていくHTML文書です。2つ目は、ブラウザがスタイルシートを読み込み、スクリプトを実行し、そのスクリプトが求めるものを取得したあとに組み立てる姿です。人が目にするのは常に2つ目だけです。

ボットは主に1つ目を使います。GooglebotはヘッドレスChromeでページをレンダリングしますが、それは後回しの工程で、遅れることもタイムアウトすることもあります。Bingbotのレンダリングはもっと限られます。AIアシスタントにデータを渡すクローラーや、チャットやSNSのプレビュー取得ボットは、たいていJavaScriptをまったく実行しません。テキストが2つ目の姿にしかないなら、機械の読み手のかなりの部分は空のページを受け取っています。

このチェックは1つ目を取得して、そこで止まります。何も実行せず、スタイルシートも適用しません。

テキスト表示の読み方

ページの本文をソースの順にたどり、テキストとして表示します。スクリプト、スタイル、テンプレート、インラインのSVG図は飛ばします。残りは次のように示します。

#、##、###
見出しとそのレベルです。これらの行だけを読んでみてください。ページの目次として機能するはずです。
下線付きの語
リンクです。マウスを重ねると、リンク先のアドレスが表示されます。
[Image: …]
画像のaltテキストです。alt属性のない画像は、ファイル名とともに「なし」と表示されます。ボタンやフォームフィールドも同じように角括弧で表示されます。
非表示と示されたテキスト
HTMLにはあるものの、hidden属性や、display:none、visibility:hidden、font-size:0、大きな負のtext-indentなどのインラインスタイルが付いた語です。
noscriptと示されたテキスト
<noscript>内の内容で、ボットとJavaScriptを使わない訪問者だけが受け取ります。

テキストの下には数値が並びます。HTMLのサイズ、表示される語数、HTMLに占めるテキストの割合、スクリプト、リンク、画像の数です。手作りやCMSのページでは、テキストの割合は10〜30%が普通です。1〜2%なら、文書のほとんどはコードです。

各結果が出る条件

結果適用するルール
JavaScript実行後にしか内容がない表示される語が60未満で、かつ次のいずれか:空のアプリケーションコンテナ(#root、#app、#__next、#__nuxt、app-rootなど)、外部スクリプトが3つ以上、インラインスクリプトが50 KB超、メインのスクリプトファイルが150 KB超。
テキストがとても少ない表示される語が150未満。
インデックスしないよう求めているrobotsメタタグまたはX-Robots-Tagヘッダーにnoindexかnoneがある。
Googleが許可されていないページのパスが、robots.txtでGooglebotに適用されるDisallowルールに一致する。
表示より隠しテキストのほうが多い隠れた語が表示される語より多い(最低80語)。
ボットがたどれないリンクhref="#"、href="javascript:…"、またはhrefのないonclick。
レベル1の見出しがない、altのない画像HTMLから直接数えます。

最後のブロックでは、このアドレスについてrobots.txtを10種のクローラーに当てはめます:Googlebot、Bingbot、Google-Extended、GPTBot、OAI-SearchBot、ClaudeBot、Claude-SearchBot、PerplexityBot、CCBot、Applebot-Extended。Googlebotのブロックはエラーと数えます。AIクローラーのブロックは報告するだけです。それはあなたが選んでよいことだからです。サイト全体についてより多くのボットを調べるなら、AIボットのアクセスチェックを使ってください。

テキストを1つ目の姿に入れる

チェックで空のコンテナが見つかったなら、そのページはクライアントサイドのアプリケーションです。サーバーは枠だけを送り、ブラウザが中身を埋めます。対処法を、徹底したものから順に挙げます。

  1. サーバーでレンダリングする。Next.js、Nuxt、SvelteKit、Remix、Angularはどれも、リクエストごとに完全なHTMLを生成し、そこにスクリプトを結び付けられます。たいていは書き直しではなく設定の問題です。
  2. ビルド時に静的ページを生成する。あまり変わらない内容なら、Astro、Gatsby、または上記フレームワークの静的エクスポートが、ページごとに完全なHTMLファイルを書き出します。
  3. ボット向けにプリレンダリングする。プリレンダリングサービスがレンダリング済みのスナップショットを保持し、クローラーに配信します。うまくいきますが、管理するバージョンが2つになります。

WordPressやDrupalのような従来型のCMSでは、HTMLにすでにテキストが入っているので、見つかる問題は小さなものです。画像の中にしかない価格、リンクがonclickハンドラーのメニュー、altが空のバナー画像に入った電話番号などです。

隠しテキストは、hidden属性とインラインスタイルからしか検出しません。外部スタイルシートのクラスで隠されたテキストは、ここでは表示扱いになります。スタイルシートを読み込まないためです。折りたたみメニュー、タブ、アコーディオンは普通のもので、検索エンジンがペナルティを与えることはありません。

よくある質問

Googleはクロール時にJavaScriptを実行しますか?

はい。ただし第2段階としてです。GoogleはまずダウンロードしたHTMLをインデックスし、そのあとページをヘッドレスChromeでのレンダリング待ちに回します。この工程は遅れることがあり、遅いスクリプトや、スクロールやクリックで読み込まれる内容までは待たないこともあります。

ChatGPT、Claude、PerplexityのクローラーはJavaScriptを実行しますか?

原則として、しません。GPTBot、ClaudeBot、PerplexityBot、CCBotはHTMLをダウンロードしてそのテキストを読みます。内容の表示にスクリプトが必要なページは、彼らにほとんど何も渡せません。

隠しテキストはSEOに悪いですか?

インターフェースの一部であれば問題ありません。メニュー、タブ、アコーディオン、ダイアログは普通にインデックスされます。検索エンジンがスパムとみなすのは、キーワードを増やすためにわざと訪問者から隠したテキスト、たとえば白い背景に白い文字などです。

テキストとHTMLの比率はどれくらいが良いですか?

目標値はなく、ランキング要因でもありません。丁寧に作られたページは10〜30%に収まることが多いです。とても低い数値は、内容の量に対してマークアップやインラインスクリプトが多いというヒントにすぎません。

自分のサイトだとほとんど何も表示されないのはなぜですか?

サーバーがアプリケーションの枠を送り、内容はブラウザで追加されているからです。ページのソースを開き(Ctrl+UまたはCmd+Option+U)、ページ内の文を検索してください。見つからなければ、JavaScriptを実行しないボットにも見えていません。