ブロガー一覧ページのHTMLソースを見ると分かるが、それぞれのブロガートップへのリンクは次のようになっている。
<div class="person">
<div class="photo"><a href="https://www.itmedia.co.jp/webolution/"><img src="https://image.itmedia.co.jp/webolution/top_photo.jpg" alt="朴 世鎔" style="width:auto;height:auto" /></a></div>
<div class="name"><a href="https://www.itmedia.co.jp/webolution/">朴 世鎔<br />
<span class="blogexcerpt"><div class="bloguser">Webolution</div>
<div class="bloginfo">より幸せになるWebのために書き続ける</div>
<div class="bloggername">朴 世鎔</div></span></a></div>
</div>
この規則性を見ると、Web::Scraperを利用して次の条件で取得することができる。
my $blogtopurl =
'http://blogs.itmedia.co.jp/portal2/blogger/list.html';
# div.personの下のdiv.photoの下のa hrefの部分を取得
my $scrape = scraper {
process 'div.person > div.photo > a',
'personurl[]' => '@href';
result 'personurl';
};
my $result =
$scrape->scrape(URI->new($blogtopurl));
ブロガーのURLが分かったら、記事を抜き出してみよう。記事をたどるのには、Web::Mechanizeを用いた。
記事すべてからキーワードを検索してもよいが、それぞれの記事には、「過去記事へのリンク」や「コメント」、「ヘッダ」「フッタ」といった要素もある。
HTMLソースを確認すると分かるが、オルタナティブ・ブログの場合、ブロガーが書いた記事の本文は、div class="body" という要素の内部に存在している。そこでWeb::Scraperを用いて、この部分のテキストだけを取り出せばよいのだ。
ここでは本文だけを取り出しているが、記事タイトルも取り出して統計を見るというのもよいだろう。また、「タイトル」「見出し」は、より重要であると考え、重み付けする――例えば、h1の内部なら5倍、h2の内部なら3倍など――といった方法もあるだろう。
my $scrape = scraper {
process 'div.body', 'body[]' => 'text';
result 'body';
};
my $result = $scrape->scrape($content);
抜き出したら、これをMeCabに流して解析する。
リスト2では、「名詞」であり「数」と「代名詞」ではないものをキーワードの対象とした。これは「数」を入れると、「1」「2」といった数字、「代名詞」を入れると「それ」「これ」といった無意味な語句がキーワードの対象となるため、それを省きたかったためだ。
もちろん、どのような語句を除外するのかは用途次第である。
my $body = join ' ', @$result;
my $node = $mecab->parse($body);
while ($node)
{
my @parsed = split /,/, $node->feature;
# 名詞であり、「数」と「代名詞」ではないものに限る
if ($node->surface && $parsed[0] eq '名詞'
&& $parsed[1] ne '数' && $parsed[1] ne '代名詞')
{
$keywords{$node->surface}++;
}
$node = $node->next;
}
あとは、コンテンツ中のリンクを再帰的にたどって行けばよい。そして最後に、キーワードが登場した数で並べ替えて、大きいもの順に並べ替えて出力すると、最終的な結果が得られる。
この特集では、コンテンツのスクレイピングをするためのさまざまな方法を説明してきた。この手法を用いれば、情報元サイトよりも付加価値を持たせた分析まとめサイトを作り上げることもできるだろう。
従来、スクレイピングといえば、「正規表現による抜き出し」や「ツリー構造を解析するプログラム」が基本であり、敷居が高いものだった。しかしWeb::Scraperを始めとするモジュールを使えば、簡単に必要な部分を取り出せるということがお分かりいただけたと思う。
コンテンツをスクレイピングするということは、一種のデータマイニング操作だ。
モジュールが提供されることによってスクリイピングが容易に実現できるようになった今、もはやHTMLは「見るだけ」のものではない。整理して自分好みに加工し、データを活用するという、新たな流れが見え始めているのだ。
Copyright © ITmedia, Inc. All Rights Reserved.