初めてのスクレイピング

現在、友人とWebサービスを作る計画があり、そのサイトを作るためにスクレイピングが必要だったのでちょっと勉強してみました。

※追記
DOMツリー生成は時間がかかるのでネストが深くない場合は正規表現がオススメです

スクレイピングとは?

はてなキーワードによると「ウェブサイトのデータを必要な部分だけ抽出して利用すること」だそうです。
あるウェブサイトのデータをとってきたいときにそのサイトのAPIが提供されていればそのAPIを使用すればいいわけですが、提供されていない場合は、スクレイピングをする必要があるわけです。

例えば、WikipediaAPIが提供されていないので必要なデータをとってきたいときにとってこれません。スクレイピングすればとってくることができます。
Wikipediaはidをあまり指定しないサイト構成をとっているのでスクレイピングでデータをとってはこれるのですが、かなり面倒くさいです。

方法

たくさん方法があり、ライブラリも多く提供されていますが私は「PHP Simple HTML DOM Parser」を使いました。

実践

では実際にやってみましょう。
下記のサイトを参考にしました。
ITキヲスク | htmlSQLよりアツい!?jQueryみたいにセレクタでHTMLをparse(解析)する「PHP Simple HTML DOM Parser」

まずPHP Simple HTML DOM Parserダウンロードですが、PHP Simple HTML DOM ParserのDownload latest version form Sourceforge. のリンク先にある緑色のボタンを押せばダウンロードできます。
使用するのは、「simple_html_dom.php」だけなのでこれを適当な場所に置いて使用します。

今回は中日ドラゴンズの投手陣たちの写真をとってきたいと思います。
中日ドラゴンズ 公式サイト - 選手名鑑

サイトの構成は以下のなっています。

写真はidがpitcherであるdivタグの子要素にある、classがplayer-photoであるdivタグ内のimgタグで管理されています。
このセレクタをfindファンクションの引数に記入してあげるとその情報がとってこれます。

今回はsrc属性が相対パスになっていたのでsrc属性だけを引っこ抜いてこちらで絶対パスになるように編集しています。

もしsrc属性だけではなくimgタグ全体をとってきたい場合は

$e->outertext;

としてください。
詳しくはこちらに載っています。PHP Simple HTML DOM Parserマニュアル

プログラム

<?php
include('./simple_html_dom.php');
$url="http://dragons.jp/teamdata/players";
$html = file_get_contents($url);
$htmlEnco = mb_convert_encoding($html, "UTF-8", "auto");
$htmlDom = str_get_html($htmlEnco);
foreach($htmlDom->find('#pitcher .player-photo img') as $e){
	echo "<img src=\"";
	echo "http://dragons.jp";
	echo $e->src;
	echo "\" width=\"85\" height=\"94\">";
}
?>

結果

実行するとこうなります

最後に

今回はノーマルなサイトを取り上げましたが、mixiFacebookなどのログインしないとみれないサイトのデータをとってきたい場合はHTTP Clientを使えばスクレイピングできます。これを使えばあなたの気になっている子の画像データをFacebookからしこたま落とすことができるのです。素晴らしい…!←
また、通信方式がSSL(https)方式の場合はHTTP Classを使用すればできるみたいです。SSLの場合はまだ自分もやったことがないのでできたらUPしようと思います。