特集
» 2007年12月21日 13時10分 公開

まとめサイト2.0:付加価値コンテンツとは――スクレイピングからグラフ化まで (1/5)

HTMLを解析し、スクレイピングしたデータを基にグラフ化を行う。遷移を把握するために有効なものとして、さまざまな応用が考えられるだろう。

[大澤文孝,ITmedia]

この記事は、オンライン・ムックPlus「まとめサイト2.0」の一部です。関連する記事は、こちらでご覧になれます。


 前回までの記事で、オルタナティブ・ブログを例とした過去ランキングの「期間」を抜き出すスクレイピングについて解説した。

 今回の記事では、スクレイピングの最終目的となる「各週の1位から10位のタイトルとURL」を配列として抜き出す手法、そしてグラフ化を行う手順までを見てみよう。

 1位から10位のタイトル、そしてURLを抜き出すスクレイピングには、幾つかの手法が考えられる。例えばリスト2のように記述することが可能だ。

リスト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でダンプすると、例えば次のページのようになる。

       1|2|3|4|5 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ

マーケット解説

- PR -