2008年声優言及数 作業メモ(2) 言及数グラフデータを取得

キーワードグラフサービス - XXXannex
この辺りからパラメーターを調べて、名前リストから言及数データをダウンロードするためのスクリプトを生成する。

日付の計算

日付のパラメーターを指定するに当たっては、こんな感じのスクリプトを作成する。

use strict;
use warnings;
use Date::Calc qw(:all);

# specify YYYYMMDD or YYYY-MM-DD format as an argument
my $ymd = shift || join('', Today());
$ymd =~ /(\d{4}).?(\d{2}).?(\d{2})/;
my ($year, $month, $day) = ($1, $2, $3);
print "$ymd - Day of year : " .  (Day_of_Year($year, $month, $day) - 1) . "\n";
$ perl doy.pl 2008-12-31
2008-12-31 - Day of year : 365

はてな仕様なので、「1月1日からの日数-1」を返す。つまり、日付 - x が1月1日になるようなx。

ファイル名の規約

例えば、こんな感じのデータを取ってくる場合を考えます。

http://d.hatena.ne.jp/keywordstats/%b9%e2%b3%c0%ba%cc%cd%db?mode=graph&type=refcount&date=2008-12-25&range=400

画像から開始日+レンジを取ってくるのがスマートだと思いますが、なかなか難しいので*1ファイル名に情報を埋め込むことにします。つまり

%b9%e2%b3%c0%ba%cc%cd%db_2008-12-25_400.png

といった具合にファイル名を指定して

/(.+)_(\d{4})-(\d{2})-(\d{2})_(\d+)/

といった具合にマッチングすれば、名前+日付+レンジの情報を取り出すことができるという寸法ですね。

$ echo %b9%e2%b3%c0%ba%cc%cd%db_2008-12-25_400.png | perl -nle 'print "$1,$2,$3,$4" if /(.+)_(\d{4})-(\d{2})-(\d{2})_(\d+)/'
%b9%e2%b3%c0%ba%cc%cd%db,2008,12,25

ダウンロード

上の事情をふまえて、こんな感じのスクリプトでダウンロードリストを作ってみる。

use strict;
use warnings;
use Encode;
use URI::Escape;

# $end must be YYYY-MM-DD
# e.g. http://d.hatena.ne.jp/keywordstats/%b9%e2%b3%c0%ba%cc%cd%db?mode=graph&type=refcount&date=2008-12-25&range=400

my $end   = shift;
my $range = shift;
die('specify $end and $range!') if(!$end or !$range);

my $enc_htn  = 'euc-jp';
my $enc_wiki = 'utf8';
while(<>){
  tr/\x0A\x0D//d;
  Encode::_utf8_off($_);
  my $escaped_name = URI::Escape::uri_escape(encode($enc_htn, decode($enc_wiki, $_)));
  print "wget -O ${escaped_name}_${end}_${range}.png 'http://d.hatena.ne.jp/keywordstats/$escaped_name?mode=graph&type=refcount&date=$end&range=$range'; sleep 1;\n";
}
$ perl make_dlscript.pl 2008-12-31 365 < names.txt > list.sh

ダウンロードもPerlでやればスマートなのかもしれないけど、こういうのはwget使った方が簡単なんだよなー。

ダウンロード後

存在しないキーワードの統計グラフを取ってこようとすると、404が返される。なので実際にデータを取ってくることはないんだけど、0バイトのファイルができてしまうのでこの辺を消しておく。

$ find ./ -size 0 -type f | xargs rm

まあ、簡単に。

$ ls | wc -l
1006

それでもまだ多いなあ・・・。

*1:というか、面倒なので