スクレイピングをしてみよう 取得〜表示編
前回は環境を整えただけだったので、今回は実際にコードを書いてみました。
ターゲットにするサイトを決める
まずは、スクレイピングしたいサイトを決めましょう。
今回はわかりやすくDMMのトップページ(http://www.dmm.com/)をターゲットにしてみます。
スクレイピングをする箇所を決める
では次にDMMのトップページのどの部分をデータとして抜くのかを決めます。
今回は左側のメニューのなかにある「動画」以下の
「TBSオンデマンド」から「成人作品(R18)」
の部分をテキストデータとして取りたい。としてみます。
下の画像の赤枠部分ですね。
この部分のhtmlは以下のようになっているので、
<div id="side-l"> <div class="smc"> <p class="smh"><img src="http://p.dmm.com/p/common/side/ttl.gif" width="34" height="10" alt="MENU"></p> <div class="sms"> <ul> <li> <div class="tx10">自宅でライブを楽しむ<span id="sms-tx14"></span></div> <strong><a href="http://www.dmm.com/lod/">AKB48グループ</a></strong> <ul> <li><a href="http://www.dmm.com/lod/akb48/">AKB48</a></li> <li><a href="http://www.dmm.com/lod/ske48/">SKE48</a></li> <li><a href="http://www.dmm.com/lod/nmb48/">NMB48</a><img src="http://p.dmm.com/p/common/side/tx_new.gif" width="24" height="12" alt="New" class="side-new"></li> <li><a href="http://www.dmm.com/lod/hkt48/">HKT48</a><img src="http://p.dmm.com/p/common/side/tx_new.gif" width="24" height="12" alt="New" class="side-new"></li> </ul></li> <li> <div class="tx10">見たい動画だけ選んで楽しむ<span></span></div> <strong><a href="http://www.dmm.com/digital/">動画</a></strong> <ul> <li><a href="http://www.dmm.com/digital/tod/">TBSオンデマンド</a></li> <li><a href="http://www.dmm.com/digital/bandai/">バンダイチャンネル</a></li> <li><a href="http://www.dmm.com/digital/anime/">アニメ</a></li> <li><a href="http://www.dmm.com/digital/idol/">アイドル</a></li> <li><a href="http://www.dmm.com/digital/cinema/">映画・ドラマ</a></li> <li><a href="http://www.dmm.com/digital/music/">ミュージック</a></li> <li><a href="http://www.dmm.com/digital/fight/">格闘技</a></li> <li><a href="http://www.dmm.com/digital/video/">バラエティ</a></li> <li><a href="/service/-/exchange/=/url=DRVESVwZTkVPEh9cXltIVA5LXEYfXQ1eCxZWCh0_/">成人作品(R18)</a></li></ul></li> <li>
抜き取りたい部分のDOM構造としては、以下のようになると思います。
div#side-l ul li ul li a
実際にテキストを抜いてみる
この部分を抜くコードを試行錯誤で書いてみました。
<?php // simple_html_dom.phpファイルの読み込み include_once('../lib/simplehtmldom_1_5/simple_html_dom.php'); // スクレイピングしたいページのURL $html = file_get_html('http://www.dmm.com/'); // DMMはEUCなのでUTFに変換 $str = mb_convert_encoding($html, "UTF-8", "EUC-JP"); // 取得したい部分をfind foreach($html->find('div#side-l ul li ul li a') as $element) // そのままだとaタグも含んでいるのでテキストだけ抜く echo $element->plaintext . '<br>'; ?>
実行した結果がこちら。
本当は、「TBSオンデマンド」から「成人作品(R18)」までが欲しいんですが、
構造的にその部分だけを(div#side-l ul li ul li a)のような形で指定は出来ないので該当するテキストが全て羅列されています。
◯番目という指定を加える
// 0番目に発見されたa要素を取得する。見つからない場合はnullが返される
$str = $html->find( ‘a’, 0 );
これを応用してみましょう。取得したいテキストは、
div#side-l ul li ulの中で2番目に現れるので、
$str = $html->find(‘div#side-l ul li ul’, 1 );
上記のような指定を加えて書きなおしてみました。
<?php // simple_html_dom.phpファイルの読み込み include_once('../lib/simplehtmldom_1_5/simple_html_dom.php'); // スクレイピングしたいページのURL $html = file_get_html('http://www.dmm.com/'); // DMMはEUCなのでUTFに変換 $str = mb_convert_encoding($html, "UTF-8", "EUC-JP"); // まず最初に2番目のulを抜く $element = $html->find('div#side-l ul li ul',1); // 上で抜いたulの中のliを抜く foreach ($element->find('li') as $litext ) { // そのままだとaタグも含んでいるのでテキストだけ抜く echo $litext->plaintext . '<br>'; } ?>
で、実行すると抜きたい部分だけが抜けました!
次回はこのテキストをWordPressにカテゴリとして突っ込んでみることにチャレンジします。