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を解析して必要なデータを取得する」は以上です。