sinkin' in the rain

22/09/2008

Wassrのタイムラインを解析するWeb::Scraper

otsune:

tsukamoto:

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)

  1. cxx reblogged this from otsune
  2. raitu reblogged this from tsupo and added:
    Wassrの一日の発言を何かにまとめたいので、DIY。 とりあえず、Wassrのタイムラインを解析するWeb::Scraperのコンストラクション部分。だいたい普通に欲しいものは入ってくると思うんだけど、どうでしょ?
  3. ohton reblogged this from oppeke
  4. oppeke reblogged this from tsupo
  5. tk78 reblogged this from otsune
  6. ljmp reblogged this from otsune and added:
    Wassrの一日の発言を何かにまとめたいので、DIY。 とりあえず、Wassrのタイムラインを解析するWeb::Scraperのコンストラクション部分。だいたい普通に欲しいものは入ってくると思うんだけど、どうでしょ?
  7. anaineko reblogged this from kossie
  8. nasunet reblogged this from otsune
  9. tsukamoto reblogged this from otsune and added:
    $rl->resolve($_[0]);...うわ、scraperの入れ子すごい!こんなのできるんだ! それができるならということで、イイネリストも解析してみる。 my...
  10. qiring reblogged this from otsune
  11. kossie reblogged this from otsune
  12. hiori reblogged this from otsune
  13. tsupo reblogged this from otsune
  14. otsune reblogged this from tsukamoto and added:
    添削した。これってdateをDatetimeに食わせて同じ日付だったらwhile loopでNextLinkをさらにscrapeしてresultに追加するみたいな処理が必要なのか。 #!/usr/bin/perl use strict;...
  15. tsukamoto posted this
Tumblr » powered Sid05 » templated