アクセス解析(2):「機械的」なアクセスの識別・除去

January 11, 2009 – 7:51 pm

ブログへのアクセスログを見ると、明らかに「機械的」なアクセスと考えられるもがかなりの数に達することに気づく。こうしたアクセスには、Google、Yahooなどによるクローリングによるものが多い。こうした「機械的」なアクセスを通じて、我がブログは検索用にインデックス化されていくわけだ。有難いことだ。しかし、我がブログの記事がどのように読まれているのかという観点からアクセス解析をしようとすると、こうした「機械的」なアクセスに関る情報、ある意味情報ノイズといえる。この種のアクセス情報は、解析対象とするデータから除去してしまいたい。除去方法について考えてみた。

User Agent情報による識別: いろいろ試行錯誤の結果、「機械的」なアクセスを生身の読者からのアクセスから区別・識別する方法のひとつに、User Agent情報を利用することができるのに気がついた。User Agentに含まれる情報の解析には、phpのget_browser()関数が使える。具体的な例で、User Agent情報がget_browser()でどのように取り扱われるか見てみよう:

<?php
     $user_agent ="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
     $browser = get_browser($user_agent, true);
     print_r($browser);
?>
        

この例は、私のPC(Windowsマシン)がWebにアクセスした際に送られるUser Agent情報をget_browser()関数で解析しようとした例だ。これを実行すると、

Array
(
    [browser_name_regex] => ^mozilla/4\.0 (compatible; msie 7\.0; .*windows nt 5\.1.*).*$
    [browser_name_pattern] => Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1*)*
    [parent] => IE 7.0
    [platform] => WinXP
    [browser] => IE
    [version] => 7.0
    [majorver] => 7
    [win32] => 1
    [frames] => 1
    [iframes] => 1
    [tables] => 1
    [cookies] => 1
    [backgroundsounds] => 1
    [cdf] => 1
    [vbscript] => 1
    [javaapplets] => 1
    [javascript] => 1
    [activexcontrols] => 1
    [cssversion] => 2
    [supportscss] => 1
    [minorver] => 0
    [alpha] =>
    [beta] =>
    [win16] =>
    [win64] =>
    [isbanned] =>
    [ismobiledevice] =>
    [issyndicationreader] =>
    [crawler] =>
    [aol] =>
    [aolversion] => 0
)
        

となる。

User Agent情報が正しく設定されており、アクセスがクローラによるものであれば、get_browser()から出力される連想配列$browser[‘crawler’]はtrueになる。これによりアクセスがクローラによるものであるかどうかを識別することができる。上記の出力例では、当然のことながら、私のPCからのアクセスであるから、Falseになっている。

アクセスが明らかにクローラによるものである場合でも、このget_browser()関数ではクローラであると判定されないものもある。User Agent情報が正しく設定されていないのだ。こうしたものについて、get_browser()関数の出力をみると、User Agentの情報のうちブラウザ情報が欠けているものが多いのに気づく。こうした「機械的」なアクセスを識別するのに、ブラウザ情報の有り無しを手がかりとして使うことができそうだ。

ブラウザ情報が与えられていない場合、連想配列$browser[‘platform’]は’unknown’となる。確証はないが、経験的にいって、「機械的」なアクセスはこれで識別できると考えられる。

このふたつの識別法を、前々回のブログエントリー「phpによる自前のWebアクセスツール作成を検討」で示したアクセス情報の蓄積用関数get-access()のなかで用いている。関連部分を抜書きしたのが以下:

        ・・・・
       $_SERVER['HTTP_USER_AGENT'];
           ・・・・
       $browser = get_browser( null, true );
       if ( $browser['crawler'] ) return;
       if ( $browser['platform'] == ‘unknown’ ) return;
        

get_browser()関数を使用するには多少の準備が必要だ。このあたりは、get_browser()関数の使用法に合わせて、phpのマニュアルに詳しく述べられている。マニュアルには「注意」書きがあり、これには次のように記述されている:

注意:この関数が正常に機能するためには、php.iniのbrowscap設定が、システム上のbrowscap.iniの正確な位置を指している必要があります。
browscap.iniはPHPにはバンドルされていません。ここで 最新のphp_browscap.iniを入手することができます。

browscapのダウンロードサイトを見ると、このbrowscap.iniは頻繁に書き換えらるようだ。私がダウンロードしたのは2008年12月17日版。これを使用する際には、最新版をいつも使うように気をつけておかねばならないだろう。

その他の「機械的」なアクセス: かなりの「機械的」なアクセスは、上記したUser Agent情報から識別、除去することができる。しかし、User Agent情報からは識別できない情報も見受けられる。こうしたアクセスのひとつに、150.70.8.xxxなるIPアドレスからのアクセスがある。このIPアドレスからのアクセス挙動、結構、興味深いものだ。少し詳しく、これについてみてみる。

以下に示すのは、前々回の記事の最後に示した、command.phpを実行し、アクセス情報DBの内容を出力したものの一部だ。このコマンドを用いると、我がブログへのアクセス時に読者がどのページを読んでくれているのか、それなりに把握することができる。

Time    = 2009-01-06 19:53:33
Visitor = Visitor-Host-Name
Refferer= www.google.com
Keywords= 東京電力 電気買取価格
 No of Pages Visited=4
      Time         = 2009-01-06 19:53:33
      Page_title   = 太陽光発電の電気いくらで売れる?
      Time         = 2009-01-06 19:56:31
      Page_title   = 太陽光発電で我が家のエネルギー自給は可能?
      Time         = 2009-01-06 19:58:24
      Page_title   = 新型の太陽電池が開発される?
      Time         = 2009-01-06 19:59:18
      Page_title   = アル・ゴア著・枝廣淳子訳『不都合な真実』を読んでみて

Time    = 2009-01-06 19:54:54
Visitor = 150.70.84.151
Refferer=
Keywords=
 No of Pages Visited=4
      Time         = 2009-01-06 19:54:54
      Page_title   = 太陽光発電の電気いくらで売れる?
      Time         = 2009-01-06 19:57:38
      Page_title   = 太陽光発電で我が家のエネルギー自給は可能?
      Time         = 2009-01-06 19:59:47
      Page_title   = 新型の太陽電池が開発される?
      Time         = 2009-01-06 20:00:42
      Page_title   = アル・ゴア著・枝廣淳子訳『不都合な真実』を読んでみて
        

この出力例から、1月6日の19:53:33にある読者が検索キーワード「東京電力 電気買取価格」を用いてGoogleの検索エンジンにより我がブログにアクセスしてくれ(Visitorのホスト名は仮の名前Visitor-Host-Nameとしておく)、その後、我がブログ内の4ページを読んでくれていることが分かる。

次に、これから1分21秒後、150.70.84.151からアクセスがあり、興味深い(不気味な)ことに、Visitor-Host-Name(仮)さんのアクセスの場合と、全く同じ並びで同一のページが読まれている。Webアクセス解析の立場からいうと、この場合、Visitor-Host-Nameさんのアクセスが2つのアクセスとしてカウントされることになる。

150.70.84.151は何か調べてみると、「150.70.84.xxからのアクセス」という記事に出会った。この記事によると、このIPアドレス、どうもトレンドマイクロ社製のもので、ウイルスバスターを搭載していると、Webにアクセスすると、トレンドマイクロ黒社のサーバーが同一のページを読み取り、なんらかの解析をすることになっているようだ。この種のアクセスは、アクセス解析の立場からは、通常のアクセスとしてはカウントしないようにしたい。我がアクセス解析ツールでは、単純に、アクセス記録からはじいてしまうことにした。

この種のアクセスは、Webのアクセス解析をする立場からいうと、情報ノイズといったものだ。他にも、この種のアクセスがあるのではと推察される。なんらかの方法で、挙動が特異なアクセスを識別し、本来の読者と、こうした機械的なアクセスを区別する手段も考えなければならない。


  1. One Response to “アクセス解析(2):「機械的」なアクセスの識別・除去”

  2. get_browser関数の使い方を調べててたどり着きました。
    参考にさせていただきます。
    なお、携帯の古い機種だとplatformがunknownとなるケースが多いようです。
    携帯サイトで実装する場合は注意が必要かもです。
    browscapで携帯の機種にも完全対応してくれると助かるのですが。

    By wolfgang on May 31, 2010

Post a Comment