[PHP] PHP Simple HTML DOM Parserでスクレイピング

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のブラウジングをシミュレートする。

引用:ウェブスクレイピング | wikipedia

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



Author: webmaster