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

» 2007年12月21日 13時10分 公開
[大澤文孝,ITmedia]
リスト4■週間ランキング推移をグラフ化する

use strict;
use utf8;
use encoding 'utf8', 
  STDIN=>'utf8', STDOUT=>'utf8';
use URI;
use Web::Scraper;
use YAML;
use GD::Graph::linespoints;
# スクレイピングする
my $url = 
  'http://blogs.itmedia.co.jp/portal2/pastranking.html';
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));
# -- グラフ用にデータをとりまとめる
# 8週分だけデータを使う
my $itemnum = 8;
# 期間中に存在するURL一覧を保存し、キーとする
my %existskey = {};
for (my $i = 0; $i < $itemnum; $i++)
{
  my $links = 
    $result->{'ranking'}->[$i]->{'link'};
  for (my $j = 0; $j < @$links; $j++)
  {
    my $linkname = $links->[$j]->as_string();
    my $titlename =
      $result->{'ranking'}->[$i]->{'title'}->[$j];
    $existskey{$linkname} = $titlename;
  }
}
# 見つかったキーからグラフ用のランクデータを作る
# X軸のヘッダ(期間)の配列を作成
my @graphdata = ();
my @titles = ();
for (my $i = $itemnum - 1; $i >= 0; $i--)
{
  push @titles, $result->{'term'}->[$i];
}
push @graphdata, \@titles;
# それぞれの期間のデータ
while (my ($key, $value) = each(%existskey))
{
  my @linkdata = ();
  for (my $i = $itemnum - 1; $i >= 0; $i--)
  {
    my $links = 
      $result->{'ranking'}->[$i]->{'link'};
    
    # 見つからないときはundefとする
    my $findlink = undef;
    for (my $rank = 0; $rank < @$links; $rank++)
    {
      if ($links->[$rank]->as_string() eq $key)
      {
        # グラフの上下を逆にするために負の数にする
        $findlink = -($rank + 1);
      }
    }
    push @linkdata, $findlink;
  }
  push @graphdata, \@linkdata;
}
# グラフにする
my $graph = 
  GD::Graph::linespoints->new(640, 480);
# オプションを設定
$graph->set(
  title => 'ranking',
  line_width => 1,
  y_min_value => -10,
  y_max_value => -1,
  y_tick_number => 9,
  y_number_format => 
    sub {my $value = shift; return -$value;}
);
# プロット
my $gd = $graph->plot(\@graphdata);
# 出力
open OUT, ">graph.png";
binmode OUT;
print OUT $gd->png();
close OUT;

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ