22/09/2008
Wassrのタイムラインを解析するWeb::Scraper
Wassrの一日の発言を何かにまとめたいので、DIY。
とりあえず、Wassrのタイムラインを解析するWeb::Scraperのコンストラクション部分。だいたい普通に欲しいものは入ってくると思うんだけど、どうでしょ?use Web::Scraper;
my $resolver = sub { my $rl = HTML::ResolveLink->new(base => $url ); return $rl->resolve($_[0]); };
my $scraper = scraper {
process ‘//p[@class=”message description”]’, ‘description[]’ => [‘HTML’, $resolver];
process ‘//a[@class=”MsgUserName”]’, ‘name[]’ => ‘TEXT’;
process ‘//a[@class=”MsgDateTime”]’, ‘date[]’ => ‘TEXT’, ‘url[]’ => ‘@href’, ‘title[]’ => ‘@title’;
process ‘id(“PagerNextLink”)’, ‘next’ => ‘@href’;
};こんな感じで結果はエントリーにまとめこめばOK。
my @entries = ();
my $result = $scraper->scrape($html, $url);
for (my $i = 0; $i < $#{$result->{‘date’}}; $i++) {
my $entry = { map { $_ => $result->{$_}->[$i] } qw(date description name title url) };
$entry->{‘date’} =~ s/\([A-Z][a-z][a-z]\)//;
push(@entries, $entry);
}あと$result->{‘next’}が取れてきてれば、次ページがあるから、あとはお好きにってことで。
追記:最初はdescription中の画像やリンクが相対URLになってて気に入らなかったのだけど、絶対URLにする方法をtokuhiromさんに教えてもらって上のスクリプトも更新。感謝!
追記(2):otsuneさんから添削をもらって、修正。ありがとうございます!
添削した。これってdateをDatetimeに食わせて同じ日付だったらwhile loopでNextLinkをさらにscrapeしてresultに追加するみたいな処理が必要なのか。
#!/usr/bin/perl use strict; use URI; use Web::Scraper; use HTML::ResolveLink; my $url = URI->new("http://wassr.jp/user/otsune"); my $resolver = sub { my $rl = HTML::ResolveLink->new(base => $url ); return $rl->resolve($_[0]); }; my $scraper = scraper { process '//div[@class="MsgBody"]', 'entries[]' => scraper { process '//p[@class="message description"]', 'description' => ['HTML', $resolver]; process '//a[@class="MsgUserName"]', 'name' => 'TEXT'; process '//a[@class="MsgDateTime"]', 'date' => 'TEXT', 'url' => '@href', 'title' => '@title'; }; process 'id("PagerNextLink")', 'next' => '@href'; }; my $result = $scraper->scrape( $url );
うわ、scraperの入れ子すごい!こんなのできるんだ!
それができるならということで、イイネリストも解析してみる。
my $scraper = scraper {
process '//div[@class="MsgBody"]', 'entries[]' => scraper {
process '//p[@class="message description"]', 'description' => ['HTML', $resolver];
process '//div[@class="favorite_list"]//a', 'favorite[]' => scraper {
process '//a', 'title' => '@title', 'url' => '@href';
process '//img', 'image' => '@src';
};
process '//a[@class="MsgUserName"]', 'name' => 'TEXT';
process '//a[@class="MsgDateTime"]', 'date' => 'TEXT', 'url' => '@href', 'title' => '@title';
};
process 'id("PagerNextLink")', 'next' => '@href';
process 'id("PagerPrevLink")', 'prev' => '@href';
};
Web::Scraper便利すぎだよ!
Reblogged & Liked (14 notes)
-
cxx
reblogged this from
otsune
-
raitu
reblogged this from
tsupo
and added:
Wassrの一日の発言を何かにまとめたいので、DIY。 とりあえず、Wassrのタイムラインを解析するWeb::Scraperのコンストラクション部分。だいたい普通に欲しいものは入ってくると思うんだけど、どうでしょ?
-
ohton
reblogged this from
oppeke
-
oppeke
reblogged this from
tsupo
-
tk78
reblogged this from
otsune
-
ljmp
reblogged this from
otsune
and added:
Wassrの一日の発言を何かにまとめたいので、DIY。 とりあえず、Wassrのタイムラインを解析するWeb::Scraperのコンストラクション部分。だいたい普通に欲しいものは入ってくると思うんだけど、どうでしょ?
-
anaineko
reblogged this from
kossie
-
nasunet
reblogged this from
otsune
-
tsukamoto
reblogged this from
otsune
and added:
$rl->resolve($_[0]);...うわ、scraperの入れ子すごい!こんなのできるんだ! それができるならということで、イイネリストも解析してみる。 my...
-
qiring
reblogged this from
otsune
-
kossie
reblogged this from
otsune
-
hiori
reblogged this from
otsune
-
tsupo
reblogged this from
otsune
-
otsune
reblogged this from
tsukamoto
and added:
添削した。これってdateをDatetimeに食わせて同じ日付だったらwhile loopでNextLinkをさらにscrapeしてresultに追加するみたいな処理が必要なのか。 #!/usr/bin/perl use strict;...
-
tsukamoto
posted this