アクセスログからおおよそのRSS登録者数を調べる方法

ここでは、ApacheのアクセスログからおおよそのRSS登録者数を抽出する方法を説明します。

RSSリーダーにはWeb型RSSリーダーとクライアント型RSSリーダーがあります。 ここでは、Web型RSSリーダーからは集約された登録者数を抽出し、それ以外はREMOTE_HOST毎に1つのクライアントとみなしています。

サンプルコード

Perlでのサンプルコードです。 RSS URLへのアクセスから、購読者数を抽出しています。


#!/usr/bin/perl

# サイトで提供しているRSSのURLに変更して下さい
my $MYRSSURL = "/rss.php";

my %webreader;
my %other;

open(LOGFILE, "access_log.txt") || die $!;

while (<LOGFILE>) {
  /^([^ ]*) ([^ ]*) ([^ ]*) \[([^\]]*)\] "([^"]*)" ([^ ]*) ([^ ]*) "([^"]*)" "([^"]*)"/;

  $remotehost = $1;
  $fromidentd = $2;
  $remoteuser = $3;
  $datetime = $4;
  $httprequest = $5;
  $httpstatus = $6;
  $databytes = $7;
  $refer = $8;
  $useragent = $9;

  # HTTP requestからURL部分を抽出
  $httprequest =~ /^([^ ]*) ([^ ]*) (.*)$/;
  $url = $2;

  # RSS以外のURLへのアクセスは無視
  if ($url ne $MYRSSURL) {
    next;
  }

  if ($useragent =~ /^livedoor FeedFetcher/) {
    if ($useragent =~ /; ([^ ]*) subscribers\)/) {
      $subscribers = $1;
      $webreader{"livedoor"} = $subscribers;
    }
  }
  elsif ($useragent =~ /^Feedfetcher-Google/) {
    if ($useragent =~ /; ([^ ]*) subscribers;/) {
      $subscribers = $1;
      $webreader{"google"} = $subscribers;
    }
  }
  elsif ($useragent =~ /^Hatena RSS/) {
    if ($useragent =~ /; ([^ ]*) subscribers\)/) {
      $subscribers = $1;
      $webreader{"hatena"} = $subscribers;
    }
  }
  elsif ($useragent =~ /^Bloglines\//) {
    if ($useragent =~ /; ([^ ]*) subscribers\)/) {
      $subscribers = $1;
      $webreader{"bloglines"} = $subscribers;
    }
  }
  elsif ($useragent =~ /^Netvibes/) {
    if ($useragent =~ /; ([^ ]*) subscribers;/) {
      $subscribers = $1;
      $webreader{"netvibes"} = $subscribers;
    }
  }
  elsif ($useragent =~ /^HanRSS\//) {
    if ($useragent =~ /; ([^ ]*) subscribers\)/) {
      $subscribers = $1;
      $webreader{"hanrss"} = $subscribers;
    }
  }
  else {
    # Web系以外はremote host毎に1としてカウント
    $other{$remotehost} = 1;
  }
}

close(LOGFILE);

#
# 結果表示
#

print "\n";
print "======\n";
print "web type readers\n";
print "======\n";
print "\n";

$sum = 0;
foreach $key (keys %webreader) {
  print "$key : " . $webreader{$key} . "\n";
  $sum += $webreader{$key};
}

print "\n";
print "======\n";
print "sum\n";
print "======\n";
print "\n";

print "web type rss readers : $sum\n";

$sum_others += keys(%other);

print "client type rss readers : $sum_others\n";

print "\n";
print "sum : " . ($sum + $sum_others) . "\n";
print "\n";

exit;


このやり方は非常にいい加減です。 もっと正確にやるには、例えば、対応するRSSリーダーの種類を増やしたりする必要があります。 クライアント型には固有IDをUSER_AGENTに含むタイプの物もあります。 単純にREMOTE_HOSTで1つと数えずに、そのようなクライアントに対応した抽出も合わせて行う方が良いと思われます。

このサンプルでは、全てを一度メモリに書き込んで計測していますが、もっと良い方法もあるかも知れません。


IPv6基礎検定

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