どこからたどり着いたかを知る(2)

前述した単純なリファラー取得例は、単純に回数を数えるだけでした。 ここでは、もう少し複雑な処理を行ってより正確な回数を表示させたり、表示順を並び替えて見やすくしたりする方法を説明したいと思います。

不必要な部分を省く

前述した単純な例では、全ての行のrefererを計算していました。 しかし、アクセスログにはページを取得するのに失敗した履歴や、ページ内の画像ファイルをダウンロードする際の履歴も含まれています。 普通はページを閲覧された回数で集計したいと思うので、全ての行を集計するとページビュー回数があまり正確ではなくなってしまいます。 ここでは、まず、閲覧に失敗した履歴を省きます。 次に、HTTPリクエストを見て「.html」や「/」で終わるURLを要求された場合のみを扱って集計を行います。

前述した単純な例では、最終的な結果の表示順序はバラバラでした。 そのため、結果が表示されても非常にみにくいものになっていました。 ここでは、結果を少ない順に並び替えて表示さることにより見やすくしたいと思います。

以下に、perlスクリプトのサンプルを示します。


#!/usr/bin/perl

# (注意)/usr/bin/perlの部分は必要に応じて変更してください。

# (注意)"access_log.txt"は解析するアクセスログのファイル名に
#  変更してください。
open(LOGFILE, "access_log.txt") || die $! . "\n";

# 一行ずつアクセスログファイルを読みます。
while (<LOGFILE>) {

  # perlのパターンマッチを行っています。
  # $1,$2,...$9にマッチした結果が入ります。
  /^(.*) (.*) (.*) \[(.*)\] "(.*)" (.*) (.*) "(.*)" "(.*)"/;

  # 成功したHTTPトランザクションのみを扱う
  # 失敗したものなどを記述した項目は飛ばす
  $httpstatus = $6;
  if ($httpstatus != 200) {
    next;
  }

  # パターンマッチの結果を変数に代入しています。
  $referer = $8;
  $httprequest = $5;

  # HTTPリクエストからURL部分を取り出します
  @cols = split(" ", $httprequest);
  if ($cols[0] eq "GET") {
    $url = $cols[1];

    # .htmlと/で終わる部分だけを対象に計算
    # (画像ファイルなどの情報をここで省きます)
    # 必要に応じて「.cgi」やその他の拡張子を追加してください
 
   if ($url =~ /\.html$/ || $url =~ /\/$/) {

      # 取得したrefererをキーにした連想配列の値を増やします
      $referercount{$referer}++;
    }
  }
}
close(LOGFILE);

# 連想配列に覚えさせたreferer数を表示します
# $keyには、refererが入っています
# $referer{$key}には、各回数が入っています
# sortを使って回数の少ない順に並び替えて表示しています
foreach $key (sort {$referercount{$a} <=> $referercount{$b}}
                keys %referercount) {
  print $referercount{$key};
  print "\t$key\n";
}

exit;


かなり色々詰め込んだサンプルになってしまいましたが、追加部分の説明は「ページビュー取得例」を参考にしてください。


IPv6基礎検定

YouTubeチャンネルやってます!