Webスクレイピングとは、WebサイトのHTMLデータを取得し、特定のデータを抽出し、整形することを言います。ウェブに掲載されているデータを1個1個コピペで取得する作業は大変です。このような時にスクレイピングが役に立ちます。
今回は「PHP Simple HTML DOM Parser」というライブラリを使ったスクレイピングの方法を紹介します。
ウェブスクレイピングとは
ウェブスクレイピングはwikipediaによると以下のように説明されています。
ウェブスクレイピング
ウェブスクレイピング(Webscraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。
ウェブ・クローラー(Web crawler) あるいはウェブ・スパイダー(Web spider)とも呼ばれる。
通常このようなソフトウェアプログラムは低レベルのHTTP(Hypertext Transfer Protocol)を実装することで、もしくはInternet ExplorerまたはMozilla FirefoxなどのWebブラウザを埋め込むことによって、人間によるWWWのブラウジングをシミュレートする。
PHP Simple HTML DOM Parser利用の準備
PHP Simple HTML DOM Parser – Browse Files at SourceForge.netからライブラリをダウンロードします。
適当なディレクトリに「simple_html_dom.php」をアップロードしてから、require_once(‘/パス/simple_html_dom.php’)で読み込んで利用します。
CakePHPで利用する方法はこのページの下部に記載しておきます。
PHP Simple HTML DOM Parserの使い方
URLからデータを読み込んで使う場合は下記のように記載します。
「file_get_html」を使います。
<?php //URLからデータを取得する場合 $html = file_get_html( 'http://www.example.com/' ); //リンク項目を表示 foreach($html->find('a') as $element){ echo $element->href . '<br>'; } ?>
実験用にHTMLソースを変数に入れて指定しました。
このときは「file_get_html」ではなく「str_get_html」を使うので注意してください。
<?php //テスト用に作成したHTMLソースを読み込む場合 $text=<<<EOF <html> <body> <h1>サンプルサイト</h1> <div id="Sample"> サンプルサイトの紹介 <div class="SampleBox"><a href="http://www.yahoo.com">Yahoo!</a></div> <div class="SampleBox"><a href="http://www.google.com">Google</a></div> </div><!--Sample--> </body> </html> EOF; //リンク項目を表示 $html = str_get_html($text); //表示 foreach($html->find('a') as $element){ echo $element->href . '<br>'; } //出力結果 http://www.yahoo.com http://www.google.com ?>
このプログラムではソース内にあるaタグの中にあるURLだけが表示されます。
CSSセレクタを利用して抽出
例:指定したidに含まれる要素の中からaタグにあるURLを抽出
<?php $text=<<<EOF <html> <body> <h1>サンプルサイト</h1> <div id="SampleA"> サンプルサイトAの紹介 <div class="SampleBoxA"><a href="http://www.yahoo.com">Yahoo!</a></div> <div class="SampleBoxA"><a href="http://www.google.com">Google</a></div> </div><!--Sample--> <div id="SampleB"> サンプルサイトBの紹介 <div class="SampleBoxB"><a href="http://www.example.com">Example</a></div> <div class="SampleBoxB"><a href="http://www.google.com">Google</a></div> </div><!--SampleB--> </body> </html> EOF; $html = str_get_html($text); //表示 foreach($html->find('#SampleB a') as $element){ echo $element->href . '<br>'; } //出力結果 http://www.example.com http://www.google.com ?>
ここでは id が SampleB の要素の中のURLを抽出しているので、サンプルサイトBの中のURLだけが表示されます。
$html->find(‘#SampleB a’)という形でCSSのセレクタを指定できるのがいいですね。本当に簡単に抽出できてしまいます。
セレクタ指定方法
class属性がtestの要素を取得
$sample= $html>find( ‘.test’ );
img要素を取得
$sample= $html>find( ‘.img’ );
title属性のあるa要素を取得
$sample= $html>find( ‘a[title]’ );
ul要素内に含まれる li要素を取得
$sample= $html>find( ‘ul li’ );
class属性がsampleのtableに含まれる th要素を取得
$sample= $html>find( ‘table.sample th’ );
Domからの読み出し
hrefを取得
$element>href
srcを取得
$element>src
altを取得
$element>alt
テキストを取得
$element>plaintext
CakePHPでの利用方法
CakePHP2で「PHP Simple HTML DOM Parser」を利用するときはダウンロードしてきたファイルの中にある「simple_html_dom.php」を/App/Vender/内にコピーします。
あとは利用したいコントローラなどで
App::import(‘Vendor’, ‘simple_html_dom’);
と記載して読み込めば利用できます。
※他人のウェブには著作権がありますので、スクレイピングしたデータを勝手に利用はできません。
環境:CakePHP2.5.6