読者です 読者をやめる 読者になる 読者になる

どんどこすすむの日記

どんどこすすむオフィシャルブログ

Goutteをcomposerでインストール

PHP

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.jsonphpスクリプトのディレクトリに置いて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便利。

参考
http://d.hatena.ne.jp/hnw/20120115