Web::Scraper
スクレイピングとかしょっちゅうやってる気がするけど最近なかなかネタがなかったので使わず仕舞いだった。
今日ちょっと思いついた事があったので使ってみるよ。
#!/usr/bin/perl
use strict;
use URI;
use Web::Scraper;
use Data::Dumper;my $articles = &GetArticles(shift);
print Dumper($articles);sub GetArticles(){
my $url = shift;
my $asahi_list = scraper {
process 'ul.list>li',
'articles[]' => scraper{
process 'li>a', url => '@href';
};
result 'articles';
}->scrape(URI->new($url));
my @articles = ();
map{ push @articles, &GetArticle($_) } @{$asahi_list};
return \@articles;
}
sub GetArticle(){
my $str = shift;
my $url = 'http://www.asahi.com'.$str->{url};
my $title = $str->{title};
my $asahi_article = scraper {
process 'h1#cap', title => 'TEXT';
process 'p#date', date => 'TEXT';
process 'div.kiji', content => 'TEXT';
result qw/title date content/
}->scrape(URI->new($url));$asahi_article->{url} = $url;
return $asahi_article;
}
記事リストのul class="list"の中のliの中のaタグから単体記事へのリンクを取得して、さらに単体記事からタイトル、更新日時、本文を取得し保存する。ul.list>liとli>aはこの組み合わせ以外だとなんかうごかず(ul.listとaとかだとだめ)。
んで実行。
perl hoge.pl http://www.asahi.com/national/list.html > hoge.txt
$VAR1 = [
{
'date' => '2007年05月24日01時09分',
'url' => 'http://www.asahi.com/national/update/0524/OSK200705230096.html',
'content' => ' スポーツ用品大手のアシックス(神戸市)は、バスケットボールシューズ「ゲルバースト アップセット」の2種類で、靴底が一部はがれる恐れがあるとして、24日から回収を始める。全国で約2万6000足を出荷し、うち約1万7000足が売られたとみられる。けがをしたなどの報告はないという。 同社によると、地面と接触する靴の裏部分の設計ミスが原因という。問い合わせは同社(0120・770・108)へ。 ',
'title' => 'バスケットシューズ欠陥 アシックス回収へ'
},
...
これまじですごく使い易い。覚えておくべき。
# 朝日の記事は後々何かに使う。
コメント (2)
このモジュール,ソースがはんぱなくテクニカルで全く理解できなかったです。。
投稿者: hiroyuki | 2007年05月25日 04:32
え、200行だよこれ
ありえんてぃ
投稿者: negipo | 2007年05月25日 09:36