PHP 界きっての変態フレームワークとの噂の rhaco には強力なスクレイピングのライブラリがあるそうな。
折角だから試してみた。
どうせ試すんだから、Zend Framework から呼び出してみる。
単純に require_once 'Rhaco.php'; とかして、使えばいいんだろうけど、ラップするクラスを作った。
ラップ用のクラス
<?php require_once 'rhaco/Rhaco.php'; class My_Vendor_Rhaco { private $_package = array(); public function __construct() { } public function setPackage($package) { if (is_array($package)) { foreach ($package as $key => $val) { array_push($this->_package, $val); } } else { array_push($this->_package, $package); } $this->_package = array_unique($this->_package); if (is_array($this->_package)) { foreach ($this->_package as $key => $val) { $ret = Rhaco::import($val); if (!$ret) { require_once 'Exception.php'; throw new My_Vendor_Exception('Import package failed:' . $val); } } } return $this; } public function factory($class) { return new $class; } }
Exception.php は単純に Zend_Exception を継承しただけのクラス。ラッパーのクラスと同階層に設置してる。
setPackage(); は Rhaco::import へのエイリアス。
引数にパッケージ名を string か 配列で渡すと、Rhaco::import(); が実行される。
呼び元
自分のはてダの日記のタイトル名を取得する。
<?php require_once 'My/Vendor/Rhaco.php'; $rhaco = new My_Vendor_Rhaco(); $package = array( 'tag.model.SimpleTag', 'network.http.Browser' ); $page = $rhaco->setPackage($package) ->factory('Browser') ->get('http://d.hatena.ne.jp/heavenshell'); $page = StringUtil::encoding($page); $simpleTag = $rhaco->factory('SimpleTag'); $simpleTag->set($page); foreach ($simpleTag->getIn('h3') as $key => $val) { var_dump(strip_tags($val->getValue())); }
結果
string '■[PHP] PHPUnit を使ってユニットテスト' (length=50) string '■[Mac][PHP][Vim] Vim で PHP のマニュアルを表示する' (length=64) string '■[雑記] 関西の OSS' (length=25) string '■[PHP] CakePHP 勉強会' (length=26) string '■[Mac] Safari Stand バージョンアップ' (length=46) string '■[PHP][ニコニコ動画][Zend Framework]ニコニコ動画のお勧め動画を取得する api' (length=99) string '■[PHP][ニコニコ動画][Zend Framework] rhaco を使ってニコニコ動画のサムネイル情報を取得するにインスパイアされて' (length=150) string '■[PHP][Zend Framework] Zend_Layout で Smarty を使う' (length=57)
あっさり取れた。rhaco すげー。
よくわからないのが、factory() でインスタンスを動的に生成してるけど、
生成時に複数の引数の渡し方が分からない(´・ω・`)
<?php public function factory($class, $params = null) { if (is_null($params)) { return new $class; } return new $class($params); }
これでは当然 1 つの引数しか突っ込めない。
<?php return new $class($params[0], $params[1]);
こうすれば引数を 2 つ渡せるけど、渡す引数が複数あって、可変だった場合はどうやったらいいんだろう。
call_user_func() は静的なクラスメソッドなら呼び出せるみたいだけど・・。
なんか上手い方法あるんだろうか。。。それとも factory にしてわざわざ呼ぶ必要がないのかなぁ。。。
あと rhaco の使い方も rhaco 本体のソース見ながら作ったので、これであってるのか良く分からん(´・ω・`)
というわけでここが違うって指摘下さい。。。