1. はじめに
このサイトは php を利用したスクレイピング処理の具体的手法について記載されたサイトにしようと思っています。なので、あまり面白いサイトではありません。内容も偏重していることと思いますが、ご質問などがございましたら、りょーちまでご連絡ください。
1.1. スクレイピングとは
スクレイピングの話しを始める前に、現在のWebサービスについて幾つか言及しておきます。
現在様々な会社が様々なWebサービスを展開しています。かなり昔、今よりWebサイトそのものが少ない頃の時代は、HTMLファイルを手動で作成することが殆どでした。しかし、現在はバックグラウンドにデータベースが存在し、データベースの内容を動的に表示し、ページを作成するようなサイトがかなり多くなっています。
さて、データベースを利用するメリットは何でしょうか?
幾つかの視点が挙げられると思います。
最も重要な点は、ひとつひとつページを作成しなくても、CGIなどによるプログラミングを利用して、あるひな型にデータを流し込み表示させることで多くのページを動的に作成することができるという点です。
このデータベースにアクセスする方法は、各社のエンジニアが独自に作成したCGIプログラムからアクセスすることができます。換言すれば、通常は製作者の開発したプログラムからしかアクセスできません。
外部からこのデータにアクセスする方法は存在しないかと言えば必ずしもそうではありません。サービスによっては、外部から限られたデータにアクセスするためのAPIが提供されていることがあり、このAPIを通じてDBにアクセスすることができます。
では、APIが提供されていないWebサービスのデータにアクセスすることはできないのでしょうか? その答えは基本的には「Yes」です。データに外部からアクセスする手段が存在しない場合は、当然アクセスすることはできないのですが、ブラウザなどでアクセスした際に表示されているものに関してはその情報を取得することができそうです。
先ほど述べたように、サーバ上のプログラムを通じて「DBからあるひな型に流し込んだデータ」は当然にして、ある決まったフォーマットで表示されているはずです。この決まったフォーマットを解析し、データ部分のみを取り出す手法をスクレイピングと呼びます。
わかりやすいので はてなブックマーク を例に考えて見ましょう。
はてなブックマークのトップページには、「最近の人気エントリー」というものが表示されています。これは、はてなブックマークに最近激しくブックマークされているサイトを10件、表示するというものです。この情報を取得するにはどうすればよいでしょうか?
最も簡単なのはブラウザで見て確かめる方法ですが、プログラミングでこれを取得する場合はどうするかといえば、HTMLソースを取得して解析すればよさそうです。先ほども述べましたが殆どのWebサービスはあるフォーマットに則って整形されたHTMLソースを吐き出しているのでそのソースを解析すればよいことになります。
はてなブックマークの場合はソースを見るとこんな部分があります。
<div class="entry-body">
<a href="http://www.snap-tck.com/room03/c02/cg/cg.html" class="bookmark" target="_blank">CGファイル概説</a>
<a href="./entrylist?url=http://www.snap-tck.com/" class="domain">www.snap-tck.com</a>
</div>
<div class="entry-footer">
<a href="/hotentry?cname=none"><img src="/images/folder.gif" alt="カテゴリ" title="カテゴリ" width="14" height="11" align="absmiddle" /></a> <a href="/hotentry?cname=none" class="keyword">一般</a>
<a href="/entry/http://www.snap-tck.com/room03/c02/cg/cg.html"><img src="/images/page.gif" alt="詳細" title="詳細" width="10" height="12" align="absmiddle" /></a> <strong><a href="/entry/http://www.snap-tck.com/room03/c02/cg/cg.html">224 users</a></strong>
<a href="/append?http%3A%2F%2Fwww.snap-tck.com%2Froom03%2Fc02%2Fcg%2Fcg.html"><img src="/images/append.gif" alt="このエントリーをブックマークに追加" title="このエントリーをブックマークに追加" width="16" height="12" align="absmiddle" /></a>
</div>
はてなブックマークのトップページに表示される「最近の人気エントリー」はすべてこのパターンです。
ブックマークされたページのタイトルは2行目にある<a>タグで囲まれた「CGファイル概説」というタイトルになります。
また、そのリンク先は<a>タグのhref属性で指定されている
http://www.snap-tck.com/room03/c02/cg/cg.html
という文字列になります。
つまり、はてなブックマークの「最近の人気エントリー」10件をAPIを使わずに取得するには、下記のような手順が考えられます。
- はてなブックマークのトップページの全てのHTMLファイル(BODYの中だけでもよいが)を取得
- 最近の10件が表示されているパターンを認識し、はじめの1件のタイトルとURLを取得
- 同様の手順で10件まで繰り返し
次のページからその手順について考えて見ましょう。