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.