HTMLを解析し、スクレイピングしたデータを基にグラフ化を行う。遷移を把握するために有効なものとして、さまざまな応用が考えられるだろう。
この記事は、オンライン・ムックPlus「まとめサイト2.0」の一部です。関連する記事は、こちらでご覧になれます。
前回までの記事で、オルタナティブ・ブログを例とした過去ランキングの「期間」を抜き出すスクレイピングについて解説した。
今回の記事では、スクレイピングの最終目的となる「各週の1位から10位のタイトルとURL」を配列として抜き出す手法、そしてグラフ化を行う手順までを見てみよう。
1位から10位のタイトル、そしてURLを抜き出すスクレイピングには、幾つかの手法が考えられる。例えばリスト2のように記述することが可能だ。
my $scrape_ranking = scraper {
process 'span > a',
'link[]' => '@href', 'title[]' => 'text';
result 'link', 'title';
};
my $scrape_term = scraper {
process 'div#postranking > div.rankingdata',
'term[]' => 'text';
process 'div#postranking > div.ranking',
'ranking[]' => $scrape_ranking;
result 'term', 'ranking';
};
my $result =
$scrape_term->scrape(URI->new($url));
リスト2では、$scrape_rankingと$scrape_termという2つのscraperブロックを定義している点に注目しよう。scrapeメソッドを呼び出しているのは、$scrape_termのほうだ。
このscraperブロックでは、次のように宣言している。
process 'div#postranking > div.rankingdata',
'term[]' => 'text';
process 'div#postranking > div.ranking',
'ranking[]' => $scrape_ranking;
result 'term', 'ranking';
1行目は、「id属性がpostrankingであるdiv要素の配下にある、class属性がrankingdataであるdiv要素」のテキストをterm[]に入れる処理であり、これにより、過去ランキングの「期間」がとれる。これはすでに説明した通りだ。
2行目は、「id属性がpostrankingであるdiv要素の配下にある、class属性がrankingdataであるdiv要素」が見つかったら、$scrape_rankingの結果をranking[]に入れるという処理を指定している。
この$scrape_rankingは、次のように指定した別のscraperブロックである。
my $scrape_ranking = scraper {
process 'span > a',
'link[]' => '@href', 'title[]' => 'text';
result 'link', 'title';
};
このように別のscraperブロックを指定すると、Web::Scraperは、見つかった部分を、そのscraperブロックへと引き渡し、ネスト処理するようになっている。
上記の$scrape_rankingでは、span要素の配下にあるa要素が見つかったとき、そのhref属性をlink[]へ、テキストをtitle[]へ設定しており、これにより、それぞれのランキングの「リンク」と「タイトル」を入れることができる。
リスト2の結果をYAMLでダンプすると、例えば次のページのようになる。
Copyright © ITmedia, Inc. All Rights Reserved.