HOME>WEBプログラム覚書>[PHP] スクレイピング 基本

[PHP] スクレイピング 基本

tidyとSimpleXMLでスクレイピングの練習。

php_tidy

Xampp 1.6.8には入っていないようなのでint64.org » Tidy Binaries - When 4GiB just isn't enoughからdllを ダウンロードしてphp/extensions/以下にphp_tidy.dllとリネームして設置。

apache/bin/php.iniのコメントアウトを解除して再起動。

PHP

  1. <?php
  2. ;extension=php_tidy.dll
  3. extension=php_tidy.dll
  4. ?>
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年目にして悲願の日本一に輝いた楽天投手陣のページをパースしてみます。

PHP

  1. <?php
  2. /**
  3.  * おまじない
  4.  * http://www.usamimi.info/~ryouchi/scraping/05.html
  5.  *
  6.  */
  7. $config = array('indent' => true,
  8.                  'output-xhtml' => true,
  9.                  'wrap' => 200
  10.                  //'quote-nbsp' => false
  11.                 );
  12.  
  13. $tidy = new tidy('http://www.rakuteneagles.jp/team/player/pitcher.php', $config, 'UTF8');
  14. $tidy->cleanRepair();
  15.  
  16. // body の内容を取得してSimpleXMLでパースする
  17. $sxe = simplexml_load_string(ereg_replace("&nbsp;", ' ', $tidy->body()->value));
  18.  
  19. $players = $sxe->xpath('//div[@id="playerList"]/ul/li');
  20. $players_info = array();
  21.  
  22. foreach ($players as $player) {
  23.     $no = preg_match('/^[0-9]{1,2}/', trim((string) $player->a), $matches);
  24.     $players_info[$matches[0]]['name'] = trim((string) $player->a);
  25.     $players_info[$matches[0]]['url'] = (string) $player->a->attributes()->href;
  26. }
  27.  
  28. // とりあえず出力
  29. foreach ($players_info as $key => $value) {
  30.     printf('<li><a href="http://www.rakuteneagles.jp%s">%s</a></li>',
  31.           $value['url'],
  32.           $value['name']
  33.           );
  34. }
  35. ?>

と、なんの役にも立たないスクレイピングの練習をしたところで、もうちょい便利なことないかなと考えます。

クオリティの高いベクター素材を配布してくれているQVectors - Quality Free Vector Graphicsというサイトがあるのですが、一覧ページではライセンスが見れないので不便なのです。 クレジット表示義務のあるCreative Commons -- 表示 3.0 Unportedも多いし。 なのでCCライセンスのものは省いたリストを作ります。

処理件数が多く処理時間が長くなると、apacheが処理を停止してしまいます。 下記サイトを参考に、timeoutの時間を変更しましょう。

またドメイン以下を全て執拗になめまわすような行為はアタックとなりかねないので、相手サイトに迷惑にならないよう気をつけましょう。

PHP クレイピング ライブラリ

実際はライブラリも充実してるので、ライブラリを使ったほうがよいと思います。 個人的にはjQueryっぽいセレクターが利用できる「PHP Simple HTML DOM Parser」を使おうかと思ってます。

投稿日 2010年3月16日 04:47
カテゴリ PHP
タグ サンプルコード | テストコード
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1212

コメント

コメントする
Name
Email Address
URL