読者です 読者をやめる 読者になる 読者になる

理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

@IT の開発者ブロク紹介エントリをスクレイピングして LDR に突っ込む

ここ数日、開発者ブログの紹介エントリを良く見るようになってきました。例えば、@IT にも以下のような記事があります。

RSS Reader を使っている人は「OPML を提供してくれればいいのによー」と心から思っているに違いがないのですが、残念ながらこの記事にはそれがない。ぼくは専ら RSS Reader として Livedoor Reader を使っているのですが、この記事では 15 個のブログが紹介されているため、最悪で 15 回フィードを登録しなければなりません。これは避けたい。おもいっきし避けたい。

ちょうど、WebService::LDR というモジュールを作ってる途中で、既に購読はできるようになっているため、上記エントリをスクレイピングして Livedoor Reader で開発者ブログを購読するようにする、30 行くらいのスクリプトを作ってみました。スクレイピング部分は Web::Scraper を使うとあっという間ですね。もちろん、スクリプトを書くよりか手で 15 個登録した方が早かったことは言うまでもない。

use strict;
use warnings;
use WebService::LDR;
use Config::Pit;
use Web::Scraper;

my $uri = URI->new("http://www.atmarkit.co.jp/fjava/column/andoh/andoh53.html");
my $result = scraper {
    process 'div.kwout > a', 'url[]' => '@href';
}->scrape($uri);

my $conf = pit_get('LDR', require => {
    user => 'your livedoor_id on LivedoorReader',
    pass => 'your password on LivedoorReader'
});

my $ldr = WebService::LDR->new(
    user => $conf->{user}, 
    pass => $conf->{pass}
)->login;

foreach my $u (@{$result->{url}}) {
    my $result = $ldr->subscribe($u) or do {
        warn "cannot discover feed";
        next;
    };
    $result->isSuccess
        ? print "success: $u\n" 
        : print "already subscribed: $u\n";
}

WebService::LDR の方は、まだ日次でインタフェースが大幅に変わるわ、使える API が増えていくわしている最中なので、github にも上げてません。
あーちなみに、実行するとこんなかんじになります。

$ perl -Ilib test.pl
already subscribed: http://alpha.mixi.co.jp/blog/
already subscribed: http://engineer.dena.jp/
already subscribed: http://labs.gree.jp/blog/
cannot discover feed at test.pl line 25.
success: http://mtl.recruit.co.jp/
success: http://blog.spicebox.jp/labs/
already subscribed: http://labs.unoh.net/
already subscribed: http://techlife.cookpad.com/
success: http://lab.cirius.co.jp/blog/
success: http://searchblog.yahoo.co.jp/
success: http://blogs.oracle.com/otnjp/
success: http://yuiblog.com/
success: http://blogs.msdn.com/b/ie/
cannot discover feed at test.pl line 25.
success: http://ameblo.jp/cyberx-engineer/