より多くの有益なコンテンツを検索結果に: クローラが POST リクエストにも対応しました

2012年1月31日火曜日

Google はインターネットの発展とともに、クロールやインデックスの技術も進化させていくべきと考えています。これまでにも、 Flash のインデックス登録を改良 (英語)し 、 Caffeine というより新しいインフラストラクチャー (英語)を導入してきました。また、妥当と思われる場合は フォームもクロール (英語)するようになりました。その一方で最近では JavaScript や AJAX の人気の高まりにともない、 あるページのコンテンツ全体を取得するのに POST リクエストが必要な場合や、POST リクエストから得られるデータがなければ一部情報が欠けてしまい、ページの見た目がおかしくなってしまう場合が増えてきています。このような状況は、Google 検索にとって理想的とはいえません。なぜなら、コンテンツを正しく取得しインデックス登録することができなければ、ユーザーの検索キーワードに対して、最も包括的で関連性の高い結果を返せなくなってしまう可能性があるからです。

ウェブマスターの皆さんには、ページに必要なリソースを取得する際に、通常 GET を使用するようにアドバイスしています。これは GET でページに必要なリソースを取得できる方がはるかにクロールしやすいためです。POST リクエストを GET に書き換える試みも実験的に開始していますが、ほとんどの場合、POST と GET で返されるコンテンツはまったく異なるので、単純に書き換えるだけでは一部のサイトでしか効果を得られません。また、ウェブマスターの皆さんがサイトを作る際に POST を選択する妥当な理由もあります (たとえば、GET リクエストよりも POST リクエストの方が多くのデータを付加できます)。そこで、GET リクエストの方がまだまだ一般的ではありますが、インターネット上のより多くのコンテンツを検索できるようにするために、妥当かつ安全であると判断した場合は、Googlebot は POST リクエストを実行するようになりました。

Google は、Googlebot の POST リクエストによって、意図しないユーザー側の動作が行われてしまわないよう、細心の注意を払っています。Googlebot による POST は、あくまでもページが自動的にリクエストするリソースをクロールし、通常のユーザーがブラウザでその URL を開いたときに目にするものをシミュレートするためのものです。これにより該当ページのインデックス内容とインスタント プレビューが改善される可能性があります。また、今はこのようなアプローチをとっていますが、今後新たな経験則を見出していくことでよりよい方法へと変わっていくでしょう。

それでは、今回の改善点について、いくつかの POST リクエストを例にとってご説明します。

Googlebot の POST リクエストの例
  • (ケース1): POST リダイレクト経由でページをクロールする
    <html>
    <body onload="document.foo.submit();">
    <form name="foo" action="request.php" method= "post" >
    <input type="hidden" name="bar" value="234"/>
    </form>
    </body>
    </html>
  • (ケース2): POST XMLHttpRequest 経由でリソースをクロールする
  • 以下の手順では、ページのレンダリング時に自動的に実行される XMLHttpRequest を通じて、ページのインデックス登録とインスタント プレビューの両方を改善しています。
    1. Google が以下のようなコンテンツの yummy-sundae.html をクロールします。
      <html>
      <head>
      <title>絶品!アイスクリームサンデー</title>
      <script src="jquery.js"></script>
      </head>
      <body>
      おいしいアイスクリームサンデーのページです。
      <div id="content"></div>
      <script type="text/javascript">
      $(document).ready(function() {
      $. post ('hot-fudge-info.html', function(data)
      {$('#content').html(data);});
      });
      </script>
      </body>
      </html>
    1. Google が yummy-sundae.html のインデックス登録を開始します。この過程で、コンテンツのよりよい理解やインスタント プレビュー生成のためにページのレンダリングが必要かどうかを判断します。
    2. レンダリングを行う際は、yummy-sundae.html がリソース hot-fudge-info.html への XMLHttpRequest を自動的に POST で送信します(上記の $.post(...) の部分)。
    3. POST リクエストされた URL ( hot-fudge-info.html )とリクエストデータ本体が Googlebot のクロール待ち行列に追加されます。
    4. Googlebot が hot-fudge-info.html をクロールするために POST リクエストを送信します。
    5. これで Google は yummy-sundae.html の正確なインスタント プレビューを作成できるようになりました。この際、hot-fudge-info.html のコンテンツを yummy-sundae.html に組み込む場合もあります。
    6. Google が yummy-sundae.html のインデックス登録を完了します。
    7. ユーザーが[hot fudge sundae]を検索します。
    8. ここで Google のアルゴリズムは、上記の検索キーワードに対して、yummy-sundae.html との関連性を hot-fudge-info.html の内容も含めてより適切に判断します。さらに、ページのインスタント プレビューも正しく表示されます。
サイトをクロールしやすく、インデックスに登録されやすくするには?
ヘルプ センター には Google と相性の良いサイトの作り方についての一般的な情報が掲載されています。ここでは Google がクロール、インデックスに登録しやすく、またインスタント プレビューを作りやすいサイトの作成に関しておさらいしておきましょう。
  • リソースを取得する際には(あえて POST を使う理由がない限りは) GET リクエストを使用してください。
  • ページをレンダリングするのに必要なリソースがクロールできる状態であることを確認してください。上の例でいうと、hot-fudge-info.html が robots.txt によってクロールできない状態になっていると、Googlebot はそのページを取得できません。さらに細かく言うと、XMLHttpRequest を発行する JavaScript のコードがサイト外部の .js ファイル内にあり、そのファイルが robots.txt によってクロール不可である場合、Google には yummy-sundae.html と hot-fudge-info.html の関連性がわかりません。この場合、たとえ hot-fudge-info.html がクロールできる状態にあっても、Googlebot が正しくクロールしない可能性があります。インターネット上には、さらに複雑な形で外部のリソースを組み込んでいる例が数多く存在します。Google が皆さんのサイトの構造をよりよく理解できるよう、基本的には Googlebot がすべてのリソースをクロールできるようにしてください。

    サイト内にブロックされているリソースがあるかどうかを確認するためには、 ウェブマスター ツール の [Labs] セクションにある [ インスタント プレビュー ] を選択し、確認してください。
  • Googlebot に返すコンテンツが、ユーザーのブラウザに返しているものと同じであることを確認してください。 クローキング ( Googlebot に返すコンテンツと、ユーザーへ返すコンテンツが異なるようにする行為)は、検索キーワードに関係のないコンテンツをユーザーに検索結果として提供してしまう可能性があるため、Google の ウェブマスター向けガイドライン 違反となります。これまで Google では、悪意のないウェブマスターが POST リクエストに関してクローキングを行っているケースや(悪意がなくてもガイドライン違反となります)、そのクローキングが原因で Javascript エラーが発生し、インデックスに登録されないケースを見てきました。このようなエラーによってページがインデックスされないのであれば、そもそもクローキングを行う意味もなくなります。要するに、検索と相性のいいサイトを作る場合には、クローキングはとにかく避けた方がいいということになります。

    意図せずにクローキングを行っていないか確認するには、先ほど登場したウェブマスター ツール内の[ インスタント プレビュー ] を使用するか、ブラウザのユーザー エージェント文字列を、たとえば以下のように変更します:

    Mozilla/5.0 (compatible; Googlebot/2.1;
    +https://www.google.com/bot.html)

    上記の変更を加えたあとにサイトを確認し、変化がないようであれば問題ありません。空白のページが表示される、JavaScript エラーが発生する、ページの一部が欠けていたり変化したりしている場合は、なんらかの問題があります。
  • 重要なコンテンツ(インデックス登録したいコンテンツ)は、表示の際にユーザー アクションを使用せずに、直接ページにテキストとして記入してください。ほとんどの検索エンジンはテキスト中心に作られており、テキスト ベースのコンテンツを探すことを最も得意としています。Google では様々なタイプのコンテンツをクロールし、インデックスに登録する方法を随時アップデートしていますが、重要なコンテンツはテキストで記載するのがベストであることに変わりはありません。
インデックス登録をコントロールする
Google 検索でクロールしてほしくない、インデックス登録してほしくないコンテンツがある場合は、従来通り robots.txt を使用する のが最も効果的な方法です(訳注: それでもなおインデックスに登録する可能性があります。詳細はリンク先をご参照ください)。ページのインスタント プレビューが作成されないようにする方法については、 スニペットとインスタント プレビューの削除 をご確認ください。また、Google Web Preview ユーザー エージェントや nosnippet メタ タグについての解説、インスタント プレビューの詳細は インスタント プレビューの FAQ (英語)をご参照ください。

今後について
Google は、ユーザーがより関連性の高い検索結果を得られるよう、今後も包括的なインデックス作りに取り組んでいきます。これからも Google のクロールとインデックスの方法は、インターネットそのものと同様に成長を遂げていきます。この記事に関するコメントやご質問は、 ウェブマスター ヘルプフォーラム までお寄せください。