Google検索の結果を集計したいという要望があり、



こんな感じで検索フォームを設置し、

集計結果をフォームの下に出力する簡易的なページをPHPで書いてみた。


検索結果を取得するあたりのコードは下記の通り

$word = "hoge";  //何らかの検索ワードを挿入する
$url = "https://www.google.co.jp/search?q=" . str_replace(array(" ", " "), "+", $word);

//cURLセッションを初期化する
$ch = curl_init();

//URLとオプションを指定する
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); // メソッド指定
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//URLの情報を取得する
$res =  curl_exec($ch);

if($c === false){
	echo 'Curl error: ' . curl_error($ch);
}

//セッションを終了する
curl_close($ch);

このコードで今までは動作していたが、

ある日突然エラーになって動作しなくなった。


その時のエラーは下記の通り。

Warning: file_get_contents(https://www.google.co.jp/search?q=hoge): failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable in 以下省略

どうやらサービスが利用不可らしい。


エラーメッセージの詳細のリンクがあったので確認してみたところ、

/*******************************************/

お使いのコンピュータ ネットワークから通常と異なるトラフィックが検出されました。後でもう一度リクエストを送信してみてください。このページが表示された理由

このページは、お使いのコンピュータ ネットワークから利用規約に違反すると考えられるリクエストが自動検出されたときに表示されます。ブロックは、これらのリクエストが停止されると間もなく解除されます。

このトラフィックは、リクエストを自動送信する不正なソフトウェア、ブラウザ プラグイン、またはスクリプトによって発生した可能性があります。ネットワーク接続が共有のものである場合は、同じ IP アドレスを使用している別のコンピュータが発生元の可能性がありますので、管理者に相談してください。詳しくはこちらをご覧ください。

ロボットが使用するような高度な検索語を使用したり、リクエストを非常にすばやく送信した場合も、このページが表示されることがあります。

IP アドレス: ***.***.***.***
時間: 2018-07-26T00:38:59Z
URL: https://www.google.co.jp/search?q=hoge

/*******************************************/

であった。


どうやらGoogle検索はスクリプト経由で検索をすることを禁止しているらしい。


今回のプログラムは自動で検索をし続けるというものではないし、

そもそもの話Google検索はGETでパラメータを送信する仕様なので、

何か良い手は無いか?と


$word = "hoge";  //何らかの検索ワードを挿入する
$url = "https://www.google.co.jp/search?q=" . str_replace(array(" ", " "), "+", $word);

//cURLセッションを初期化する
$ch = curl_init();

//URLとオプションを指定する
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); // メソッド指定
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);

//URLの情報を取得する
$res =  curl_exec($ch);

if($c === false){
	echo 'Curl error: ' . curl_error($ch);
}

//セッションを終了する
curl_close($ch);


今このページを開いているブラウザのユーザエージェントを、

PHPのcURL送信の際に加えてみて実行してみたところ、

サービスの使用不可のエラーが消え、無事に検索結果を集計することが出来るようになった。


実はこのコードを試す前に、

ユーザエージェントを適当な値にして送信してみたところ、

サービス使用不可のエラーは消えなかったので、

何のブラウザで検索しているか?という情報を送ることが重要らしい。