2010年03月16日 04:47

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

| http://www.kantenna.com/cgi-bin/mt/mt-tb.cgi/530

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のコメントアウトを解除して再起動。


;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の時間を変更しましょう。

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

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

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

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

トラックバック

  • http://www.kantenna.com/cgi-bin/mt/mt-tb.cgi/530
コメント (0)
コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)





この情報を登録しますか?


先月アクセスが多かったページ