[PHP] ボット, クローラーのアクセス判定する方法

ボット, クローラーのアクセスを判定する

WordPress でボットやクローラーのアクセスを判定して処理を分岐したかったのですが、Wordpress にはボット判定のメソッドはありません。したがってPHPでボットやクローラーのアクセスを判定してみます。

ボットかどうかはUA(ユーザーエージェント)を使い判定します。

$_SERVER['HTTP_USER_AGENT']

PHPでは、UAは $_SERVER['HTTP_USER_AGENT'] に格納されています。例えばGoogle Chromeでアクセスすると、UAは次の値が入っています。

Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

このようにUAは利用者のブラウザ情報を伝えてくれるので、ボットがどのようなUAを使うかわかっていれば次のようにしてボットによるアクセスかどうかの判定を行えます。

ボット判定関数

/**
 * ボット判定関数
 */
function is_bot() {
    // ボットのUAに含まれる文字列
    $bots = array(
        "googlebot",
        "bingbot",
        "yahoo", 
    );

    // UAがボットに一致するかどうか
    $ua = $_SERVER['HTTP_USER_AGENT'];
    foreach( $bots as $bot ) {
        if (stripos( $ua, $bot ) !== false) {
            return true;
        }
    }
    return false;
}

$bots 変数はボットのUAに含まれる文字列です。ひとまず代表的な Google, Bing, Yahoo のボットを判定する関数です。定義ボットと判定したい文字列を追加すればよいでしょう。

ボットのUA

ボットやクローラーは数多くありますのでどこまでをボットと判断するかは決めなければなりません。それにUAは偽装が可能なので厳密な判断はできないのである程度割り切って考える必要があります。

以下有名どころのボットを紹介します。

GoogleBot

Googleのボットです。検索用のデータを収集するボットや画像用のボットなどGoogleのボットはいくつか種類があります。

GoogleのボットのUAには、Googlebot と入っているので、これで判定します。

UA

Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

BintBot

マイクロソフトのBingBotです。これもGoogleと並んでよくアクセスされます。

UA

Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)

YahooBot

Yahooのボットです。これもいくつかあるみたいですが、サイトのアクセスログから確認できたYahooのUAは次の通りです。

UA

Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)

BaiduBot

中国の検索エンジン、百度(バイドゥ)のボットです。

UA

Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)

そのほかにもボットはいくつもあります。Webサーバーのアクセスログからどのようなボットにアクセスされているか確認しましょう。

アクセスログを確認するコマンド

ApacheやNginxを使っている場合、アクセスログのファイルからどのようなボットにアクセスされているかは、次のコマンドで確認できます。

grepする値を適宜変更して探せばよいでしょう。

$ cat /var/log/httpd/access_log | grep bot
$ cat /var/log/nginx/access.log | grep bot

以上。