Webページが検索結果に表示されるにはGoogleにインデックスされる必要があります。
このインデックスされているかどうかを直接調べる方法というのは実は存在しません。
でもどうしても調べたい場面があったので探してみたら次の2つの方法が見つかりました。
- file_get_contentsを使う方法
- curl_execを使う方法
ここでは自分の記憶の整理も兼ね、この2つのやり方とコード例についてまとめます。
1.file_get_contentsでインデックス状態を調べる方法
まず1つめは file_get_contents 関数を使って調べる方法
これはファイルの内容を文字列に読み込む関数で、外部URLを渡すことで外部ページのソースコードも取得可能です。これを上手く使えばインデックス状態が調べられます。
ただしこれ単体で調べるわけじゃありません。
Google検索ボックスで使える siteコマンド というものと一緒に利用します。
これはGoogle検索欄に site:調べたいURL と入力することで特定URLがインデックスされているか調べることができるコマンドのこと
1 |
site:https://pisuke-code.com/jquery-input-number-only/ |
上の例のような感じで検索欄に入力して使います。
そして検索結果に見つかれば「約●●件」のような表示件数を表示し、見つからない場合はその表示件数は一切表示されません。
この表示件数を正規表現を使ってマッチすることでインデックスされてるか調べられます。
例えばあるURL(ページ)がインデックスされているか調べるPHPコードは次の通り
1 2 3 4 5 6 7 8 9 10 11 12 |
/** 調べたいページのURL */ $target = 'http://example.com/is-this-indexed/'; /** 検索結果ページのソースを取得 */ $src = file_get_contents( 'http://www.google.com/search?q=site:' . $target ); if( $result = preg_match( '/"resultStats"><\\/div>/', $src ) ){ /** インデックスされている場合 */ print_r('This page is indexed.'); }else{ /** インデックスされていない場合 */ print_r('This page is NOT indexed.'); } |
このコードはGoogleの検索結果ページをスクレイピングし、特定のパターン( /"resultStats"><\\/div>/ )が含まれているかで判別してます。
ちなみに上コードは関数化させた方が使いやすいです。例えば次がそのコード例
1 2 3 4 5 6 7 8 9 |
/** * URLがインデックスされているか調べる関数 * @param string $url 調べたいURL **/ function is_indexed_by_site_cmd( $url ){ $url = 'https://www.google.com/search?q=site:' . urlencode($url); $src = file_get_contents( $url ); return preg_match( '/"resultStats"><\\/div>/', $src ); } |
使い方は is_indexed_by_site_cmd( 'https://example.com/' ); という具合に調べたいURLを渡すだけです。
以上が file_get_conetnts を使ったインデックス状態の調べ方
簡単な方法なんですが、実は問題点もあります。それは次に挙げるようなこと
- 検索結果ページを全て読み込みしてしまう
- 検索結果ページが変わると通用しなくなる
スクレイピングで「約◯◯件」という表現があるか調べてるだけなので、検索結果ページの形式が変われば当然使えなくなります。
半永久的に使えるテクニックではないことに注意が必要ですね。
2.curl_exec関数でインデックス状態を調べる方法
お次は curl_exec 関数を使ってページのインデックス状態を調べる方法
こちらの場合はスクレイピングではなく、Googleキャッシュにページが登録されてるかどうかでインデックス状態を判定します。
例えばGoogleキャッシュに登録されているかは次のURLにアクセスすれば分かります。
1 |
http://webcache.googleusercontent.com/search?q=cache:調べたいURL |
登録済みなら元ページのWeb魚拓みたいな感じでキャッシュページが表示されたはず
そして登録済みの場合だけ 200 のHTTPステータスコードが返ってくるので、それをうまく利用すればインデックス状態を知れるという訳です。
では実際にどういう風に調べるかですが、次のような関数を作ればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/** * キャッシュを元にインデックスされているか調べる * @param string $url 調べたいURL **/ function is_indexed_by_cache($url) { $url = 'http://webcache.googleusercontent.com/search?q=cache:' . urlencode($url); $ch = curl_init($url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Chrome 10'); if (!curl_exec($ch)) { return false; } $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); return $code == '200'; } |
この関数では curl_setopt を使ってボディを含まないヘッダーのみ( CURLOPT_NOBODY )を読み込んでいます。なので無駄にページ全てを読み込むということもありません。
あとは次コードのようにインデックス状態を調べて処理できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
/** 調べたいURL */ $url = 'https://pisuke-code.com/'; /** インデックスされてるかを取得 */ $result = is_indexed_by_site_cmd( $url ); if( $result ){ /** インデックスされている場合 */ print_r( 'This page is indexed.' ); }else{ /** インデックスされていない場合 */ print_r( 'This page is NOT indexed.' ); } |
単純に調べたいURLを渡せばいいだけです。
以上が curl_exec を使ったインデックス状態の調べ方
こちらの方がムダな読み込みもないし、キャッシュの有無で確認できるので確実な方法かもしれません。ただし、キャッシュされるまでは時間がかかるので公開されたばかりのページでは未インデックス扱いになるのが少し不便なところですね。
とは言ってもインデックスされているか簡単に調べるならこの方法は結構役立つと思います。
ここまでのまとめ
もしインデックス状態を調べるAPIとかあれば良かったんですが、そんなものないのでスクレイピングとかキャッシュを調べたり少し工夫が必要です。
以上、URL(ページ)がインデックスされてるか調べる方法についてでした。