- 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年を振り返る - へぼい日記 より