- 2008/12/31 水曜日 19:12:50
- perl | webservice
はてぶのタグを年と月ごとにカウントするやつつくりました。
明らかに車輪の再発明ぽいですね。誰かやってるんでしょうけどXML::LibXMLのリハビリがてらに作ってみました。
2007年と2008年のぶんをとってくるです。
$tags = {
year => {
month => {
'TAG' => count,
},
},
};
↑とってくるデータ構造はこんなかんじ。
んでコードと。
#!/usr/bin/perl
use strict;
use warnings;
use feature qw/say/;
use utf8;
use Encode;
use LWP::Simple qw/get/;
use XML::LibXML;
use XML::LibXML::XPathContext;
use DateTime;
use DateTime::Format::ISO8601;
use Storable;
my $base_url = 'http://b.hatena.ne.jp/nihen/atomfeed';
my $parser = XML::LibXML->new();
my $xc = XML::LibXML::XPathContext->new();
my $dt_fmt = DateTime::Format::ISO8601->new;
my $page = 0;
my $tags = {
2007 => {map { $_ => +{} } 1..12 },
2008 => {map { $_ => +{} } 1..12 },
};
SEARCH_2007_2008:
while (1) {
my $content = get($base_url . '?of=' . ( ++$page - 1 ) * 20);
say 'entry of ' . ($page - 1) * 20 . '-' . $page * 20;
my $doc = $parser->parse_string($content);
my $namespace = $doc->documentElement()->getAttribute('xmlns');
my $namespace_dc = $doc->documentElement()->getAttribute('xmlns:dc');
$xc->registerNs('x', $namespace);
$xc->registerNs('xdc', $namespace_dc);
my @entries = $xc->findnodes('/x:feed/x:entry', $doc);
if ( !@entries ) {
last SEARCH_2007_2008;
}
foreach my $entry ( @entries ) {
my ($issued) = $xc->findnodes('x:issued', $entry);
my $dt = $dt_fmt->parse_datetime($issued->textContent);
if ( $dt->year < 2007 ) {
last SEARCH_2007_2008;
}
my ($title) = $xc->findnodes('x:title', $entry);
my @tags = $xc->findnodes('xdc:subject', $entry);
for my $tag_el ( @tags ) {
my $tag = $tag_el->textContent;
if ( !defined $tags->{$dt->year}{$dt->month}{$tag} ) {
$tags->{$dt->year}{$dt->month}{$tag} = 1;
}
else {
$tags->{$dt->year}{$dt->month}{$tag}++;
}
}
}
store $tags, 'tagsstorefile';
}
store $tags, 'tagsstorefile';
- 新しい: 正月早々DBD::mysqlのデバッグやってた
- 古い: WALL・Eをみてきた
コメント:0
トラックバック:0
- この記事のトラックバック URL
- https://blog.everqueue.com/chiba/2008/12/31/38/trackback/
- トラックバックの送信元リスト
- はてぶタグとともに2008年を振り返る - へぼい日記 より