特集
» 2007年12月06日 09時26分 公開

まとめサイト2.0:Webを進化させるスクレイピングのセオリー (1/2)

WebAPIだけに頼る必要はない。HTML構造を解析し、さらに情報集約や付加情報を加えたまとめサイトを作る。この特集は、Webをさらに使いやすくするためのガイドだ。

[大澤文孝,ITmedia]

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


 第1回目では、マッシュアップできないならば、スクレイピングすればよいと説明した。それでは、具体的に、どのようにスクレイピングすればよいのか。今回は、スクレイピングの考え方と技法を説明していこう。

CSSの普及で、容易になったスクレイピング

 実際に、ほかのサイトにあるHTMLをスクレイピングする場合、次の処理の流れとなる。

1)サーバからHTMLデータを取得する

 これは単純に、HTTP通信してHTMLデータを取得する操作である。例えばPerlであれば、LWP(libwww-perl)を利用すればよいだろう。もっと簡単に、UNIXに付属のwgetコマンドやfetchコマンドを使ってもよいはずだ。

2)HTMLから取り出したいデータ部分を抜き出す

 1)で取得したHTMLデータを解析して抜き出す処理だ。これには幾つかの技法があるため、後述する。

3)加工して出力する

 2)で抜き出したデータを加工して出力する。例えば並べ替えたり、集計したり、統計を採ってHTML化するわけだ。

 この時、もしグラフにしたいのであれば、画像生成ライブラリを使って生成し、JPEG形式やPNG形式として出力すればよい。

 意外と難しいのが、上記の2)の処理であり、これがスクレイピングの肝となる。コンテンツのHTMLの中から、「取り出したいデータ」をどのようにして特定すればよいだろうか。

 例えば、取り出したいデータが「表」であるとしよう。その場合、cssを駆使していない比較的従来からのページでは次のように構成されているはずだ。

<table> <tr> <th>見出し</th><th>見出し</th>…略… </tr> <tr> <td>データ</td><td>データ</td>…略… </tr> 〜中略〜 </table>

 このような表をスクレイピングしたいときには、言うまでもなく、「thで囲まれた部分を取り出して『見出し』として」「tdで囲まれた部分を『データ』として」といったように処理していく。これがスクレイピングの基本的な考え方だ。

idとclassで要素を特定する

 しかしながら、1つのHTMLページには、tableタグが幾つも存在するだろう。また、tableに続くtrやth、td以外にも、たくさんのHTMLタグが入っているだろう。

 その場合でも、もちろん、「先頭からn番目のtable」といった方法で特定することもできる。

 しかしそれでは、もし、あとでWebサイトのレイアウトが変わり、tableの増減、そして位置が変わったりした場合には、対応できなくなる可能性がある。この問題を解決するのが、「id属性」と「class属性」だ。

 最近のWebコンテンツは、「構造」と「レイアウト」の分離が進んでおり、ほとんどの場合、「HTML」と「CSS(Cascading Style Sheets)」の2つのファイルで構成されている。このことが、スクレイピングを容易にする。

 HTMLの要素とCSSとを結びつけるには、主に2つの方法がある。1つはid属性で結びつける方法、もう1つはclass属性で結びつける方法だ。

 id属性は、要素を特定する値であり、1つのHTMLコンテンツ内で唯一無二の値をとる。

 一方のclass属性は、CSSスタイルを指定するものだ。見た目が同じであるなら、同じclass属性が設定されていることがほとんどだ。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ

マーケット解説

- PR -