初めてのスクレイピング
現在、友人とWebサービスを作る計画があり、そのサイトを作るためにスクレイピングが必要だったのでちょっと勉強してみました。
※追記
DOMツリー生成は時間がかかるのでネストが深くない場合は正規表現がオススメです
スクレイピングとは?
はてなキーワードによると「ウェブサイトのデータを必要な部分だけ抽出して利用すること」だそうです。
あるウェブサイトのデータをとってきたいときにそのサイトのAPIが提供されていればそのAPIを使用すればいいわけですが、提供されていない場合は、スクレイピングをする必要があるわけです。
例えば、WikipediaはAPIが提供されていないので必要なデータをとってきたいときにとってこれません。スクレイピングすればとってくることができます。
※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\">"; } ?>