tidyとSimpleXMLでスクレイピングの練習。
Xampp 1.6.8には入っていないようなのでint64.org » Tidy Binaries - When 4GiB just isn't enoughからdllを ダウンロードしてphp/extensions/以下にphp_tidy.dllとリネームして設置。
apache/bin/php.iniのコメントアウトを解除して再起動。
;extension=php_tidy.dll ↓ extension=php_tidy.dll
Tidyは、「Tidy HTML clean and repair utility」用のバインディングで、 HTML文書の誤りを直すだけでなく、操作することやドキュメントツリーを操作することも可能となります。
とありますが、目的のノードを取得するのはhtml、bodyから辿っていかないとダメっぽい?ので面倒です。なのでtidyではぶっ壊れてるかもしれないhtml/xmlを修正して、パースは別のライブラリ使ったほうが便利です。
お手軽なのはSimpleXMLでしょうか。xpathも利用できるし。ただxpathは重い処理になるとのことですが。。。
またamp;が存在するとどういうわけかSimpleXMLが解釈できないため、 tidyのオプションでquote-nbspをfalseに指定するも下記掲示板の記述にあるように動かず。一体どういうことなんだ?? まぁ仕方ないのでereg_replaceで変換します。
球団設立6年目にして悲願の日本一に輝いた楽天投手陣のページをパースしてみます。
/**
* おまじない
* http://www.usamimi.info/~ryouchi/scraping/05.html
*
*/
$config = array('indent' => true,
'output-xhtml' => true,
'wrap' => 200
//'quote-nbsp' => false
);
$tidy = new tidy('http://www.rakuteneagles.jp/team/player/pitcher.php', $config, 'UTF8');
$tidy->cleanRepair();
// body の内容を取得してSimpleXMLでパースする
$sxe = simplexml_load_string(ereg_replace(" ", ' ', $tidy->body()->value));
$players = $sxe->xpath('//div[@id="playerList"]/ul/li');
$players_info = array();
foreach ($players as $player) {
$no = preg_match('/^[0-9]{1,2}/', trim((string) $player->a), $matches);
$players_info[$matches[0]]['name'] = trim((string) $player->a);
$players_info[$matches[0]]['url'] = (string) $player->a->attributes()->href;
}
// とりあえず出力
foreach ($players_info as $key => $value) {
printf('<li><a href="http://www.rakuteneagles.jp%s">%s</a></li>',
$value['url'],
$value['name']
);
}
と、なんの役にも立たないスクレイピングの練習をしたところで、もうちょい便利なことないかなと考えます。
クオリティの高いベクター素材を配布してくれているQVectors - Quality Free Vector Graphicsというサイトがあるのですが、一覧ページではライセンスが見れないので不便なのです。 クレジット表示義務のあるCreative Commons — 表示 3.0 Unportedも多いし。 なのでCCライセンスのものは省いたリストを作ります。
処理件数が多く処理時間が長くなると、apacheが処理を停止してしまいます。 下記サイトを参考に、timeoutの時間を変更しましょう。
またドメイン以下を全て執拗になめまわすような行為はアタックとなりかねないので、相手サイトに迷惑にならないよう気をつけましょう。
実際はライブラリも充実してるので、ライブラリを使ったほうがよいと思います。 個人的にはjQueryっぽいセレクターが利用できる「PHP Simple HTML DOM Parser」を使おうかと思ってます。
/ 金額 : ¥ 2,993
1-5
6-10
/ 金額 : ¥ 3,465
/ 金額 : ¥ 3,150
/ 金額 : ¥ 2,699
/ 金額 : ¥ 3,497
/ 金額 : ¥ 3,675