PHPでGoogleやヤフーのindex数をコードで取得する方法です。
最初はスクレイピングライブラリのPHP Simple HTML DOM Parserを使ってやってみたのですが、ひどく重い。
なので、正規表現を使って自前で取得することにしました。
Googleのindex数を取得する
// Google $urlに調べたいサイトのurl
$google = "http://www.google.co.jp/search?ie=UTF-8&oe=UTF-8&q=site:".$url;
$htm = file_get_contents($google);
$regs = array();
mb_ereg(".*<div>約 ([0-9,]*) 件<\/div>.*", $htm, $regs);
$googleIndex = $regs[1];
無理やり短くすると2行。
mb_ereg(".*<div>約 ([0-9,]*) 件<\/div>.*", file_get_contents("http://www.google.co.jp/search?ie=UTF-8&oe=UTF-8&q=site:".$url), $regs);
$googleIndex = $regs[1];
関数にするならこれでいいかも。
Yahooのindex数を取得する
urlの組立てと正規表現を変えるだけ。
// Yahoo $urlに調べたいサイトのurl
$yahoo = "http://search.yahoo.co.jp/search?p=site:".$url."&ei=UTF-8";
$htm = file_get_contents($yahoo);
$regs = array();
mb_ereg(".* \/ 約([0-9,]*)件 - [0-9.]*秒.*", $htm, $regs);
$yahooIndex = $regs[1];
注意点
長い正規表現は書けない書きたくなかったので、適当な正規表現です。
そのため、検索エンジンの検索結果を引用しているサイトの本文がヒットしてしまうこともあるかもしれません。
僕はindex数の目安がわかればいいので問題ありませんが、正確なindex数*1 を知りたい場合には別の方法や、もっと詳細な正規表現を使ったほうがいいでしょう。
おまけ。CakePHPのモデルに検索エンジンのindex数を取得するメソッドを書く
// CakePHP Model
function getIndexCount($url) {
$counts = array();
// Google
$google = "http://www.google.co.jp/search?ie=UTF-8&oe=UTF-8&q=site:".$url;
$htm = file_get_contents($google);
$regs = array();
mb_ereg(".*<div>約 ([0-9,]*) 件<\/div>.*", $htm, $regs);
$counts['google'] = $regs[1];
// Yahoo
$yahoo = "http://search.yahoo.co.jp/search?p=site:".$url."&ei=UTF-8";
$htm = file_get_contents($yahoo);
$regs = array();
mb_ereg(".* \/ 約([0-9,]*)件 - [0-9.]*秒.*", $htm, $regs);
$counts['yahoo'] = $regs[1];
return $counts
}
index数は頻繁に変わるものでも無いと思うので、↓のようにキャッシュしておくと便利。
// CakePHP Model
function getIndexCount($url) {
$chacheName = "ic".sha1($url); // ユニークなら何でもいい
$counts = Cache::read($cacheName, "default"); // core.phpなどにあらかじめキャッシュのconfigを書いておこう。
if (!empty($counts)) {
return $counts;
}
$counts = array();
// Google
$google = "http://www.google.co.jp/search?ie=UTF-8&oe=UTF-8&q=site:".$url;
$htm = file_get_contents($google);
$regs = array();
mb_ereg(".*<div>約 ([0-9,]*) 件<\/div>.*", $htm, $regs);
$counts['google'] = $regs[1];
// Yahoo
$yahoo = "http://search.yahoo.co.jp/search?p=site:".$url."&ei=UTF-8";
$htm = file_get_contents($yahoo);
$regs = array();
mb_ereg(".* \/ 約([0-9,]*)件 - [0-9.]*秒.*", $htm, $regs);
$counts['yahoo'] = $regs[1];
Cache::write($cacheName, $counts, "default"); // index数をキャッシュする
return $counts
}
- そもそもsite:検索した時のindex数も約がついているように正確では無いと思うけど [↩]