PHP でクローラー判定する

(参考)
http://memorandum.yamasnet.com/archives/Post-217.html

Webサーバへのリクエストがクローラーかどうかを判定したい。
今回は、リクエストヘッダーの User-Agent で判定する。

get_browser() を使う

PHP では、get_browser() 関数を使うと簡単。

<?php
function isCrawler($ua = null) {
    $br = get_browser($ua, true);
    return ($br['crawler'] || $br['platform'] === 'unknown');
}

ただし、PHPのマニュアルにあるとおり、ブラウザ情報(php_browscap.ini)をここ から取得し、
php.ini に

[browscap]
browscap = /path/to/php_browscap.ini

と設定しておく必要がある。

Browscap クラスを使う

https://github.com/garetjax/phpbrowscap
にある、Browscap クラスを使うと browscap.ini を自動的に取得してくれる。
このクラスなら php.ini が設定変更できないレンタルサーバでも利用可能。

get_browser() 版を無理やり書き換えるとこんな感じ。

<?php
require 'path/to/Browscap.php';

function isCralwer($ua = null) {
    $browscap = new Browscap('path/to/cache/dir/');
    $br = $browscap->getBrowser(null, true);
    return ($br['Crawler'] || $br['Platform'] === 'unknown');
}

誤判定について

get_browser() によるクローラー判定に 'crawler' だけでは不十分なため、 'platform' をチェックしているが、携帯ブラウザがチェックに引っかかってしまうことに注意。
携帯は、それに特化したライブラリがいくつかあるので、そちらを利用したほうがいいだろう。