AIクローラーと検索エンジン向けインフィニットスクロールの対応方法

AIクローラーと検索エンジン向けインフィニットスクロールの対応方法

AIクローラーでインフィニットスクロールをどのように扱うべきですか?

インフィニットスクロールと従来のページネーションURLを組み合わせたハイブリッドアプローチを実装してください。AIクローラーがJavaScriptを実行せずにアクセスできる、ユニークなURLを持つクロール可能なコンポーネントページを作成しましょう。ユーザーのスクロールに合わせてpushState/replaceStateでURLを更新し、すべてのコンテンツが静的HTMLのフォールバックでアクセスできるようにします。

課題の理解:なぜインフィニットスクロールはAIクローラーから見えなくなるのか

インフィニットスクロールは、ユーザーがページを下にスクロールするたびにコンテンツが自動で読み込まれ、シームレスな体験を提供します。しかし、この手法はAIクローラー(ChatGPTのGPTBot、ClaudeのClaudeBot、PerplexityのPerplexityBotなど)にとって重大な問題を引き起こします。これらのAIシステムは、人間のようにページをスクロールしたり、操作をエミュレートしたりしません。固定された状態でページを一度だけ読み込み、すぐに取得できるコンテンツだけを抽出します。コンテンツがスクロールイベントによるJavaScriptだけで読み込まれる場合、AIクローラーは初期表示領域以外のすべてを見逃し、AI型検索エンジンや回答生成システムからあなたのコンテンツが見えなくなってしまいます。

この根本的な問題は、AIクローラーが従来の検索ボットと異なる動作をすることに起因します。GoogleのGooglebotはある程度JavaScriptをレンダリングできますが、多くのAIクローラーはJavaScriptエンジンを持つ完全なブラウザ環境を備えていません。HTMLやメタデータから素早く構造化された、取得しやすいデータを優先して解析します。JavaScript実行後のDOM内にしか存在しないコンテンツは、クローラーからアクセスできません。つまり、何百もの商品や記事、リストがあるサイトでも、AIシステムからは数件しか存在しないように見えてしまうのです。

本質的な問題:固定状態と固定サイズの制約

AIクローラーには、インフィニットスクロールを困難にする2つの重要な制約があります。第一に、ページを固定サイズで読み込みます。つまり、初期表示領域に表示されるものしか見えません。第二に、固定状態で動作し、初回ロード後はページと一切やり取りしません。ボタンをクリックしたり、下へスクロールしたり、JavaScriptイベントを発火させたりすることはありません。これは、人間ユーザーの体験とは根本的に異なります。

インフィニットスクロールがJavaScriptのみに依存して追加コンテンツを読み込む場合、AIクローラーには最初のアイテム群しか見えません。初回レンダリング後に読み込まれるものはすべて隠れてしまいます。ECサイトなら、最初の画面以降の商品リストが見えません。ブログやニュースサイトなら、最初の数記事しかAI検索結果に現れません。ディレクトリやギャラリーなら、ほとんどのコンテンツがAIシステムからインデックスされなくなります。

項目AIクローラー人間ユーザー
スクロール動作スクロールしない、固定ビューポートスクロールして追加コンテンツ表示
JavaScript実行制限ありまたは実行しないフルJavaScriptサポート
ページ操作クリックなし、フォーム送信なし完全な操作が可能
コンテンツ可視性初期HTML+メタデータのみ動的に読み込まれるすべてのコンテンツ
ページ滞在時間数秒(タイムアウト固定)無制限

解決策:ページネーションとインフィニットスクロールの併用

最も効果的なのは、インフィニットスクロールをやめることではなく、従来のページネーションシリーズの上に強化機能として実装するハイブリッドモデルです。これにより、人間ユーザーはシームレスなインフィニットスクロール体験を楽しみつつ、AIクローラーは個別のクロール可能なURLを介して全コンテンツにアクセスできます。

Google公式のインフィニットスクロール推奨事項では、コンポーネントページ(ページネーションシリーズの各ページを表す個別のURL)を作成することが強調されています。それぞれのコンポーネントページは独立してアクセス可能で、ユニークなコンテンツを持ち、JavaScriptなしで機能する明確なURLを持つ必要があります。例えば、すべての商品をインフィニットスクロールで1ページにまとめるのではなく、/products?page=1/products?page=2/products?page=3のようなURLを作りましょう。

ステップ1:ユニークなURLを持つコンポーネントページを作成

ページネーションシリーズの各ページには、完全なURLが必要です。アクセス時、ユーザー履歴やCookie、JavaScriptの実行を必要とせず、直接該当コンテンツを表示できることが必須です。URL構造はシンプルかつセマンティックで、ページ番号やコンテンツ範囲が明示されているべきです。

良いURL例:

  • example.com/products?page=2
  • example.com/blog/page/3
  • example.com/items?lastid=567

悪いURL例:

  • example.com/products#page=2(フラグメントはクローラー未対応)
  • example.com/products?days-ago=3(相対時間パラメータは古くなる)
  • example.com/products?radius=5&lat=40.71&long=-73.40(非セマンティックなパラメータ)

各コンポーネントページは、ブラウザで直接アクセス可能でなければなりません。/products?page=2にアクセスしたとき、正しい内容が即座に表示され、ページ1からのスクロールを必要としないことが重要です。これにより、AIクローラーがシリーズ内の任意のページに直接ジャンプしてインデックスできます。

ステップ2:ページ間でコンテンツの重複をなくす

ページ間の重複コンテンツはAIクローラーを混乱させ、クロールバジェットを浪費します。各アイテムはページネーションシリーズのどこか1ページのみに表示するようにしてください。1つの商品がページ1とページ2の両方に出てくると、AIはどちらが正なのか判断できず、可視性が下がります。

重複を防ぐために、各ページの範囲を明確に区切りましょう。1ページ25件表示なら、ページ1は1〜25件、ページ2は26〜50件という具合です。前のページの最後のアイテムを次ページの先頭に表示する「バッファリング」は避けてください。AIクローラーはこの重複も検出します。

ステップ3:各ページにユニークなタイトルと見出しを設定

AIクローラーに各ページが独立した存在であることを示すために、ユニークなtitleタグとH1見出しを各コンポーネントページごとに作成しましょう。単なる「商品」のような汎用タイトルではなく、ページ番号や内容の特徴がわかるタイトルにします。

titleタグ例:

  • ページ1: <title>プレミアムコーヒー豆 | 商品一覧</title>
  • ページ2: <title>プレミアムコーヒー豆 | ページ2 | さらに多彩な品揃え</title>
  • ページ3: <title>プレミアムコーヒー豆 | ページ3 | スペシャルブレンド特集</title>

H1見出し例:

  • ページ1: <h1>プレミアムコーヒー豆 - 全商品一覧</h1>
  • ページ2: <h1>プレミアムコーヒー豆 - ページ2:さらに多彩な品揃え</h1>
  • ページ3: <h1>プレミアムコーヒー豆 - ページ3:スペシャルブレンド特集</h1>

こうしたユニークなタイトルや見出しは、AIクローラーに各ページの内容が異なり、別々にインデックスすべきだと伝えます。これにより、深い階層のページもAI生成の回答や要約に掲載されやすくなります。

ページネーションリンクをAIクローラーに見せる工夫

AIクローラーはリンクをたどってコンテンツを発見します。ページネーションリンクが非表示だったり、JavaScriptでしか現れない場合、クローラーがコンポーネントページを見つけられません。明示的にナビゲーションリンクをHTML内に記述し、クローラーが検出・追跡できるようにしましょう。

1ページ目(メインリスト)の場合

メインリストページ(ページ1)には、ページ2へのリンクを表示または隠し要素として含めましょう。いくつかの方法があります。

方法1:可視な「次へ」リンク

<a href="/products?page=2">次へ</a>

商品リストの末尾にこのリンクを置きます。ユーザーがスクロールしてインフィニットスクロールを発動した際は、CSSやJavaScriptで非表示にできますが、クローラーはHTML内のリンクを認識します。

方法2:noscriptタグ内の隠しリンク

<noscript>
  <a href="/products?page=2">次のページ</a>
</noscript>

<noscript>タグはJavaScript無効時のみ表示されます。クローラーはこれを通常のHTMLとして扱い、リンクをたどります。

方法3:「もっと見る」ボタンのhref利用

<a href="/products?page=2" id="load-more" class="button">もっと見る</a>

「もっと見る」ボタンを使う場合は、href属性に次ページのURLを明記しましょう。JavaScriptでリンク動作を阻止しインフィニットスクロールを発動できますが、クローラーはhrefをたどって次ページにアクセスします。

2ページ目以降

各コンポーネントページには、シリーズ内の他ページへのナビゲーションリンクを含めてください。次のように実装可能です。

  • 前へ/次へリンク:ページ2はページ1とページ3にリンク
  • 完全なページネーション:全ページ(1, 2, 3, 4, 5…)へのリンク
  • ハイブリッド:隣接ページ+最初と最後のページ

重要: メインページ(ページ1)には常にページパラメータなしでリンクします。/products?page=1ではなく、必ず/productsへリンク。/products?page=1/productsにリダイレクトして、1ページ目の正規URLを統一しましょう。

ユーザー体験向上のためのpushState/replaceState活用

AIクローラーにはユニークなURLが必要ですが、人間ユーザーはシームレスなインフィニットスクロールを期待します。History APIのpushStateとreplaceStateを使い、ユーザーのスクロールに合わせてブラウザのURLを動的に更新しましょう。これで両立が可能です。

pushStateは新しい履歴エントリを追加し、ユーザーが「戻る」ボタンで過去のスクロール位置に戻ることができます。replaceStateは現在の履歴エントリを上書きします。インフィニットスクロールでは、新しいコンテンツ読み込み時にpushStateを使うことで、ユーザーがスクロールしたページごとに戻る操作が可能になります。

// インフィニットスクロールで新しいコンテンツ読み込み時
window.history.pushState({page: 2}, '', '/products?page=2');

この方法により、

  • アドレスバーのURLがスクロールに応じて更新される
  • ユーザーが特定のページをブックマークできる
  • 戻るボタンが直感的に使える
  • AIクローラーがページごとに異なるURLとして認識できる

インフィニットスクロール実装のテスト方法

実装前に、AIクローラーが全コンテンツにアクセスできるか必ずテストしましょう。

テスト1:JavaScript無効時のコンテンツ確認

最も簡単なテストは、JavaScriptを無効化したブラウザでサイトを巡回することです。「Toggle JavaScript」などの拡張機能を使い、スクリプトをオフにしてリストページをチェックしましょう。JavaScript無効時に消えてしまうコンテンツは、AIクローラーにも見えません。

テスト2:範囲外ページには404を返す

商品が50ページあるなら、/products?page=999にアクセスしたときは404エラーを返すようにしましょう。空白ページやページ1へのリダイレクトではなく、「ページが存在しない」ことを明示的に示し、クローラーのクロールバジェット浪費を防ぎます。

テスト3:スクロール時のURL更新確認

ユーザーがスクロールして新しいコンテンツが表示された際、アドレスバーのURLが正しく更新されているか確認します。ページ3のコンテンツまでスクロールしたら、URLが/products?page=3となるのが理想です。

テスト4:Google Search Consoleで検証

Google Search ConsoleのURL検査ツールを使い、ページネーション各ページがどのようにレンダリング・インデックスされているか確認します。いくつかのコンポーネントページを送信し、Googleが全コンテンツを取得可能かをチェックしましょう。Googleが見えるなら、他のAIクローラーもアクセスできる可能性が高いです。

上級者向け最適化:AIクローラー用構造化データ

ページネーション対応に加え、Schema.org構造化データでAIクローラーがコンテンツの意味をより深く理解できるようにしましょう。各コンポーネントページに商品や記事、レビューなど適切なマークアップを追加します。

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "プレミアムコーヒー豆",
  "description": "高品質なアラビカコーヒー豆",
  "price": "12.99",
  "paginationInfo": {
    "pageNumber": 2,
    "itemsPerPage": 25
  }
}
</script>

構造化データはコンテンツの意味や文脈をクローラーに明示的に伝え、AIシステムが生成する回答に正確に情報を反映しやすくなります。

よくあるミスと注意点

ミス1:JavaScriptのみでページネーションを実装 ページネーションリンクがJavaScript実行後にしか現れない場合、クローラーは発見できません。必ずHTML初期表示時にリンクを含めましょう。

ミス2:URLフラグメントを利用 /products#page=2のようなURLはクローラーが認識できません。フラグメントはクライアントサイド専用です。クエリパラメータやパスセグメントを利用してください。

ミス3:コンテンツの重複表示 同一商品が複数ページに出現すると、AIクローラーは重複としてインデックスしたり、正規版の判断に迷います。ページごとの厳格な範囲管理を徹底しましょう。

ミス4:モバイルクローラーを無視 モバイルビューポートでもページネーションが機能することを確認してください。AIクローラーの中にはモバイルユーザーエージェントを使うものもあります。

ミス5:クローラー対応のテスト不足 ページネーションがクローラーに対応していると決めつけず、JavaScriptを無効化してすべてのページがリンク経由でアクセスできるか必ず検証しましょう。

AIでの可視性モニタリング

インフィニットスクロール対応のページネーションを実装したら、AI検索結果でどのようにコンテンツが表示されているかを追跡しましょう。AIクローラーにインデックスされているページや、ChatGPT・PerplexityなどAI回答生成システムで自分のコンテンツが登場しているか確認します。サイトのクロール性を監査するツールを活用し、AIシステムがすべてのコンテンツにアクセスできているかを定期的にチェックしましょう。

目的は、人間ユーザーにはインフィニットスクロールの快適さを、AIクローラーにはすべてのページを体系的に発見・インデックスさせる「ハイブリッド手法」を実現し、従来検索と新しいAI型検索の両方で最大限の可視性を獲得することです。

AI検索結果でブランドの露出をモニタリング

ChatGPT、Perplexity、その他AI回答生成プラットフォームで、あなたのコンテンツがどのように表示されているかを追跡できます。ブランドが言及された際にアラートを受け取り、AIプラットフォーム全体での可視性を測定しましょう。

詳細はこちら

AIクローラーにすべてのコンテンツを認識させる方法
AIクローラーにすべてのコンテンツを認識させる方法

AIクローラーにすべてのコンテンツを認識させる方法

ChatGPT、Perplexity、GoogleのAIなどのAIクローラーにコンテンツを認識させる方法を学びましょう。AI検索での可視性を高めるための技術要件、ベストプラクティス、監視戦略を紹介します。...

1 分で読める
AI向けJavaScriptレンダリング
AI向けJavaScriptレンダリング:動的コンテンツをAIクローラーに見せる方法

AI向けJavaScriptレンダリング

JavaScriptレンダリングがAIでの可視性にどのような影響を与えるのか学びましょう。なぜAIクローラーがJavaScriptを実行できないのか、どのようなコンテンツが隠れてしまうのか、プリレンダリングがChatGPTやPerplexityなどのAI検索結果でコンテンツ表示を保証する仕組みを解説します。...

1 分で読める
AIクローラー向けプリレンダリング:JavaScriptコンテンツの可視化
AIクローラー向けプリレンダリング:JavaScriptコンテンツの可視化

AIクローラー向けプリレンダリング:JavaScriptコンテンツの可視化

プリレンダリングがChatGPT、Claude、PerplexityのようなAIクローラーにJavaScriptコンテンツをどのように可視化するかを解説します。AI検索最適化の最適な技術的ソリューションを知り、AI検索結果での可視性を高めましょう。...

1 分で読める