Perl で RSS を取り扱う方法のメモ書きです。
この手のツールは沢山溢れていて今更感が漂いまくってますが、自分用のメモとして残したいと思います。
RSS フィードから、「投稿時間」「タイトル」「URL」を抜き出すような処理を Perl でやってみます。
まずはソースから。仮に rss.pl とします。
#!/usr/bin/perl
use strict;
use warnings;
use XML::FeedPP;
use Time::Local;
my $get = 1;
my @url = (
'https://worklog.be/feed',
'http://tidanews.ti-da.net/index.xml',
'http://www.hamazo.tv/entry_t76.rdf'
);
foreach my $url (@url) {
my $count = 0;
my $feed = XML::FeedPP->new($url);
foreach ($feed->get_item()) {
my $date = substr($_->pubDate(), 0, 10);
my $time = substr($_->pubDate(), 11, 5);
my $zone = substr($_->pubDate(), 21, 1);
if ($zone != 9) {
($date, $time) = &convert_jst($date, $time);
}
print "Date : $date $time\n";
print "Title: " . $_->title() . "\n";
print "URL : " . $_->link() . "\n\n";
$count++;
if ($get <= $count) { last; }
}
}
sub convert_jst {
my ($date, $time) = @_;
my ($year, $mon, $day) = split('-', $date);
my ($hour, $min) = split(':', $time);
my $sec = 0;
my $utime = timelocal($sec, $min, $hour, $day, $mon - 1 , $year);
$utime += 3600 * 9;
($sec, $min, $hour, $day, $mon, $year) = localtime($utime);
$year += 1900;
$mon++;
$date = sprintf("%04d-%02d-%02d", $year, $mon, $day);
$time = sprintf("%02d:%02d", $hour, $min);
return($date, $time);
}
exit;
rss.pl を実行すると以下の様な出力になります。
Date : 2013-10-02 16:04 Title: Google AnalyticsのクリックカウントをjQueryで簡単に記録する URL : https://worklog.be/archives/2592 Date : 2013-10-02 12:00 Title: 【毒性に注意】防風林や公園でも用いられるオキナワキョウチクトウと果実 URL : http://tidanews.ti-da.net/e5388938.html Date : 2013-10-02 17:32 Title: 新入荷! URL : http://ohashiya.hamazo.tv/e4830370.html
XML::FeedPP モジュールがいい仕事をしてくれるので、整形くらいしかしていないですが WordPress の feed 情報は日付を UTC で吐き出すのでこれを胡散臭いルーチンで変換しています。
※ 何も考えず単純に +9 しているだけ。一度 unix time にしているのは計算が簡単だからです。
どうもこれは WordPress の仕様らしいです。
あとは取得した文字列をリンク付きに変換するもよし、URL を辿ってスクレイピングするもよしという感じです。
他のブログサービスは良くわからないですが、WordPress は「抜粋」と「全文」のオプションがあるので、記事データが必要な場合はスクレイピングしちゃった方が速いかもです。
簡単ですが、「PerlでRSSを解析して必要なデータを取得する」は以上です。