思い立つ
アクセスログに検索サイトのロボットが目立つ。

レッツPHPさんのPHP Analyzerを利用して解析。
ただし、ロボットリストに少々手を加えた。(後述)

全500ユニークアクセス中、ロボット144件。
特に多いのが
1.Yahoo! -> 55件
2.MSN -> 38件
3.百度 -> 25件
4.Google -> 14件

アクセスの3割が検索ボットって悲しいよね。
しかもBaiduspider+って何よ?って思って調べたら、中国の検索サイト「百度」のクローラだとか。
しかもBaiduspiderでググって出たサイトの多くが、行儀の悪いダメなロボットだからアクセス拒否しちゃおうって内容だった。

でも俺にとってはそんなに悪い感じはしないので、アクセス拒否とかは無しの方向にした。
それについては別項「百度のクローラ「Baiduspider」について」で。

本題。
せっかく公開してるサイトだから人がいっぱい来てくれる方がうれしい。
そのためには検索ロボットさんにいっぱい見てもらって検索にヒットするようにしてもらわないといけない。
でも検索ロボットさんはページを読み込むからカウンタを回しちゃうわけだけど、人の訪れない貧相なサイトでロボットがクルクルとカウンタを回すのはなんだか淋しい。
ということで、アクセスカウンタで書いたカウンタスクリプトに、ロボットの場合はカウントアップしないような機構を盛り込もうというのが今回のあれ。

実現
クライアントのUserAgentを見てロボットかどうか判別する関数を作って、ロボットならカウントアップしなければいい。

<?php
//UserAgentをみてロボットかどうか判断する関数
function is_robot($ua){
    if(!$ua){
        $ua = $_SERVER['HTTP_USER_AGENT'];
    }
    $robot="/(ICC-Crawler|Teoma|Y!J-BSC|Pluggd\/Nutch|psbot|CazoodleBot|
        Googlebot|Antenna|BlogPeople|AppleWebKitOpenbot|NaverBot|PlantyNet|livedoor|
        msnbot|FlashGet|WebBooster|MIDown|moget|InternetLinkAgent|Wget|InterGet|WebFetch|
        WebCrawler|ArchitextSpider|Scooter|WebAuto|InfoNaviRobot|httpdown|Inetdown|Slurp|
        Spider|^Iron33|^fetch|^PageDown|^BMChecker|^Jerky|^Nutscrape|Baiduspider|TMCrawler)/m";
    //$robotはレッツPHPさんのPHP Analyzerから拝借。
    //http://loglog.jp/~php/
    if(preg_match($robot,$ua)){
        return true;
    }else{
        return false;
    }
}
?>


別に引数なしの関数でもいいわけだけど、UserAgentを引数で与えることも出来るようにしてみた。
引数が空っぽなら今のクライアントのUserAgentを環境変数から取り出す。
$robotに、ロボットの名前を正規表現のパターングループの形式で書く。
$uaの中に$robotにマッチするものがあれば、TRUEを返す。つまり「こいつはロボットだ!」と。
じゃなければFALSEを。
そしてこれを読み込んでアクセスカウンタ本体の頭に、
if(is_robot()){
    exit;
}

を付けてやればいい。

2007.08.23訂正
カウンタをページの最後の方にincludeすると気付かないかもしれんけど、exit();を発行してしまったらその後のPHPの処理が一切されなくなるのでよろしくない。
このサイトではカウンタを呼び出した後にアクセスアナライザを呼び出してるので、今回カウンタを書き換えてから一切ロボットの足跡がアクセス解析からも消えてしまった気付いた。
ということで、ソース書き換え。

カウントアップする条件を、
「LAN内アドレスではない」かつ「ロボットでない」かつ「前回ホストと同一でない」
と、3つの条件すべてがそろったときのみに限定する。

if(!ereg("^192.168.11",$n_host) && !is_robot() && $host[0] != $n_host)

否定&否定&否定と、不細工な感じになったから、
if(!(ereg("^192.168.11",$n_host) || is_robot() || $host[0] == $n_host))
こうしてもいいと思う。
けどこれはこれで、後からソース見たときに何書いてんのか分からんくなったらイヤなので、素直に前者を選択。


一応
カウンタソース