KANTENNA.COM

Solarized

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.  ↓
  4.  extension=php_tidy.dll
  5.  ?>
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」を使おうかと思ってます。

パーフェクトPHP (PERFECT SERIES 3)
作者:橋口 誠 | 価格:¥ 3,780

トラックバック(2)

2011年9月14日 13:17

[PHP]Google Analytics からデータを取得 part2WEBプログラム覚書

「WEBプログラム覚書::[PHP]google Analytics からアクセスの多いページの情報を取得」に引き続きGoogle Analytics A...続きを読む

2011年9月14日 13:17

[PHP]google Analytics からアクセスの多いページの情報を取得WEBプログラム覚書

google AnalyticsのAPIを利用してアクセスの多いページの情報を取得します。続きを読む

コメント

コメントする
Name
Email Address
URL
TIME LINE
2012
02.03

[jQuery]closest()とparents()

今から16年前Netscapeブラウザのソースコードの公開方法の会議の中で、初めてオープンソースという言葉が使われた今日、 みなさんいかがお過ごしでしょうか。

今回の投稿はそれとは関係のないjQueryのparents()とclosest()が 似てたので何が違うのか試した時のメモです。

2012
02.01

[jQuery Mobile]初期化イベントメモ

jQuery Mobileは読み込まれてから

mobileinit -> pagebeforecreate -> pagecreate -> pageinit

の順番でイベントが発生する。

2012
02.01

[WordPress]管理画面のフッタのフィルタとアクション。

時間も時間なので、あまり使用頻度の高くない微妙なネタを。

会員制サイトなどで不特定多数の人にログインさせる場合、フッタのバージョン情報は隠しておきたかったり、 こじゃれたメッセージを表示したいときとか使うアクションとフィルタ。

2012
01.28

[WordPress] ブログの情報を取得する方法とノーキャッシュ疑惑

ブログのget_bloginfo()で取れないデータが必要な場合に使うもの。

2012
01.26

[jQuery Mobile]ダイアログ

jQuery Mobileにおけるダイアログの扱いはウインドウではなくページ。 なので通常のページと同様に扱える。ダイアログウインドウを出す。じゃなくダイアログページに遷移する。的な。

2012
01.25

[Ubuntu11.10]Ubuntuのインストール後の設定

インストール完了後の環境構築。PC起動時いちいちBIOSからブートドライブ選んで ブートするのかと思ってたら起動時にOS選択画面が出てくる。

すばらしいですね。

2012
01.24
2012
01.23

MinGW+Mintty+Git

MinGW+Mintty+Gitをやろうとして失敗に終わった。このエントリーには収穫できるものはありません。

2012
01.21

[PHP]共有サーバーユーザーのためのPEARインストール方法

共有サーバーでは自由にPEARのパッケージがインストールできないので、 プロジェクトローカルに設置することになりますが、以前httpベースのものを使ってみたんですけど、 やたら重くて使い物にならなかったので、僕は普通にFTPでアップするようにしてます。

ってことでプロジェクトローカルへのPEARのインストール方法。