スクレイピングで記事ランキングのグラフ化まとめサイト2.0(3/5 ページ)

» 2007年12月18日 12時27分 公開
[大澤文孝,ITmedia]

Web::Scraperでスクレイピングする

 HTMLから、どのようなデータを抜き出さなければならないのかが分かったところで、Web::Scraperを使って、実際にスクレイピングしてみよう。

 Web::Scraperは、「定型的な使い方の書式」さえ理解すれば、すぐにスクレイピング処理ができる便利なモジュールだ。この書式は、あれこれ説明するよりも、実際に動くソースを見てもらったほうが早い。

 まずはWeb::Scraperで、週間ランキングから、「ランキング期間」だけを取り出す例を見てみよう(それぞれのランキング順位を取得する方法は、やや複雑なので、後述する)。ランキング期間の取得条件は、すでに説明したように次の通りだ。

  • <div id="postranging>の配下にある
  • <div class="rankingdata">内のテキスト

 この条件を満たすものをスクレイピングするのが、リスト1だ。

リスト1■ランキング期間を取り出す例

use strict;
use utf8;
use URI;
use Web::Scraper;
use YAML;
my $url = 
  'http://blogs.itmedia.co.jp/portal2/pastranking.html';
my $scrape = scraper {
  process 'div#postranking > div.rankingdata', 
    'term[]' => 'text';
  result 'term';
};
my $result = $scrape->scrape(URI->new($url));
print YAML::Dump($result);

 リスト1のプログラムを実行すると、その結果は、次のようになる。


- 12/3〜12/9
- 11/26〜12/2
- 11/19〜11/25
- 11/12〜11/18
- 11/05〜11/11
- 10/29〜11/04
- 10/22〜10/28
〜以下略〜

 リスト1では、変数の値に入っているデータをダンプするため、YAMLモジュールを用いているが、これは必須ではない。実際のデータは、リファレンスとなっており、次のようにして値を取り出すことができる。


print $result->[0];
print $result->[1];

 ちなみに、「YAML」は人間が読みやすいようにインデントを使って表現したデータ構造書式だ。詳細については、http://www.yaml.org/を参照してほしい。

スクレイピング条件の指定

 Web::Scraperの基本的な使い方は、次のようになる。


use URI;
use Web::Scraper;
my $scrape = scraper {
  process 抜き出したい条件, 何をどこに設定するか
  …必要なだけprocessを並べる…
  result 上記processで設定した値のリスト
};
my $result = $scrape->URI->new(コンテンツのURL));

 上記に示したように、「use Web::Scraper;」とすると、「scraperブロック」を定義できるようになる。scraperブロックでは、以下の2つを設定する。

1)抜き出す条件を決めるprocess行(複数可)

2)最終的な結果を設定するresult行

 この2つの行の設定方法を、順に見ていこう。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ