Goutteをcomposerでインストール
GoutteでWebスクレイピング
phpでWebスクレイピングをするためGoutte(グット)というライブラリを使ってみた。
https://github.com/fabpot/goutteからgoutte.pharファイルをダウンロード。
phpスクリプトと同じディレクトリにDLしたgoutte.phar置いて
CSSセレクタを指定するだけで欲しいテキストが簡単に抜き取れた。
Chromeのデベロッパツールで要素を選択して右クリックすると、その要素のCSSセレクタがわかるので便利。
以下のようにCSSセレクタ「#Aid > div.Bclass > div > h1」でピンポイントでテキストを抜き取れる。
<?php require __DIR__.'/goutte.phar'; use Goutte\Client; $client = new Client(); $crawler = $client->request('GET', 'http://hoge.com'); $ttl=$crawler->filter('#Aid > div.Bclass > div > h1')->text();
PHP5.3だとエラー
ただし、上のコードで動いたのはローカル環境だけ。
サーバ環境にUPするとエラーになったので、なんでーなんでーと思ったら
よく公式サイトを見るとGoutteの最新バージョン(2.*)はPHP5.4以上に対応とのこと。
PHP5.3はGoutte(1.0.6)を使ってくれということだった。
私のMacBookAirのPHPは5.4だったが、サーバのPHPは5.3だった。
PHP5.3,Goutte2.0で実行した場合。goutte内で使ってるguzzlehttpというコンポーネントでエラーになった。
Parse error: syntax error, unexpected '[' in phar://hoge/goutte.phar/vendor/guzzlehttp/guzzle/src/functions.php on line 20
Goutte1.0.6をcomposerでインストール
しかたがないのでhttps://github.com/fabpot/Goutte/releasesから1.0.6をダウンロード。
そしたら今度はpharファイルがなくて困った。
goutteはいろんなコンポーネントを使用して構成されているらしく、最新のgoutte.pharはそれらがまとまっていたのだが。
goutte1.0.6にはgoutte単体しかなく、そのかわりcomposer.jsonが置いてあった。
composerでインストールしてみることにした。
composer.jsonの中身。php5.3以上となっている。その他のコンポーネントのバージョンも記載。
(略) "require": { "php": ">=5.3.0", "ext-curl": "*", "symfony/browser-kit": "~2.1", "symfony/css-selector": "~2.1", "symfony/dom-crawler": "~2.1", "symfony/finder": "~2.1", "symfony/process": "~2.1", "guzzle/http": "~3.1" }, (略)
composer.jsonをphpスクリプトのディレクトリに置いてcomoserインストール
$ composer update
requireを変更
<?php require_once __DIR__.'/../vendor/autoload.php'; use Goutte\Client; $client = new Client(); $crawler = $client->request('GET', 'http://hoge.com'); $ttl=$crawler->filter('#Aid > div.Bclass > div > h1')->text();
autoloadでエラー
今度はクラスの読み込みに失敗
Fatal error: Class 'Goutte\Client' not found in /hoge/hoge.php on line 13
composerのautoloadと自分で書いたPHPの__autoload関数を使用しているためspl_autoload_registerを使うように変更.
<?php function __autoload($class) { $fn='lib/'.$class.'.php'; if(is_readable($fn)) { require($fn); } }
↑を↓のように変更。
<?php function MyAutoLoad($class) { $fn='lib/'.$class.'.php'; if(is_readable($fn)) { require($fn); } } spl_autoload_register('MyAutoLoad');
ちなみにPHPでは__autoload関数は非推奨
http://php.net/manual/ja/language.oop5.autoload.php
とりあえず、これでうまくgoutteが使えました。
composer便利。