スクレイピングライブラリ Goutteの使い方

Tag:

Goutte(グットゥ)を利用するとウェブサイトから手軽に情報を抽出することができます。ここではGoutteの基本的な使い方について紹介します。

Goutteのインストール

Composerを利用してGoutteをインストールします。Composerの使い方については「PHP : Composerでパッケージ管理 | DN-Web64」を参照願います。

composer.jsonのあるディレクトリに移動して「composer require fabpot/goutte」を実行します。
Goutte0

参考:Goutteのパッケージ情報

Goutteの利用例

実際にGoutteを利用してみます。例として、Yahooファイナンスから企業情報を取得してみます。

require_once(realpath(__DIR__) . "/../../../../../composer_pj1/vendor/autoload.php");

$client = new Goutte\Client();
$crawler = $client->request('GET', 'http://stocks.finance.yahoo.co.jp/us/profile/AAPL');

$crawler->filter('.boardFinCom tr')->each(function($node) {
    echo "<dt>" . $node->filter('th')->text() . "</dt><br>";
    echo "<dd>" . $node->filter('td')->text() . "</dd><br>";
});

1行目
インストールしたパッケージを読み込んでいます。環境に合わせて指定してください。

3~4行目
URLを指定して、Web情報を取得しています。

6~9行目
CSS セレクタで要素を指定し、データを抽出しています。

結果は以下の通りです。
Goutte1

Goutte 豆知識

Goutte を利用する上で知っておくと役立つかもしれない情報です。

POST指定

$client->request('POST', 'http://xxxxx', ['key1' => 'val1'], ['key2' => 'val2']);

対象ノードの絞り込み

メソッド 概要
filter(“cssセレクタ”) CSSセレクタで対象ノードを指定
eq(index) インデックスで対象ノードを指定
parents() 親ノードを指定
children() 子ノードを指定
first() 最初のノードを指定
last() 最後のノードを指定
siblings() 兄弟ノードを指定
nextAll() 兄弟ノード(後)を指定
previousAll() 兄弟ノード(前)を指定

下記のように、複数メソッドを利用して絞り込むことができます。

echo $crawler->filter('.nav')
             ->first()
             ->filter('a')
             ->text();

データ抽出方法

// テキスト抽出
echo $crawler->filter('.reload a')->text();

// 属性抽出
echo $crawler->filter('.reload a')->attr("href");

// html抽出
echo $crawler->filter('.reload')->html();

任意のCSSセレクタの要素が存在するか判定

$node = $crawler->filter('.reload a');
if (count($node)) {
    // 存在する場合の処理
}

ユーザーエージェントを設定

$client = new Client();
$client->setHeader('User-Agent', 'XXXXXXXXXX');

ページ遷移

// テキストリンクをクリック
$link = $crawler->selectLink("手動更新")->link();
$crawler = $client->click($link);

// 前のページへ戻る
 $client->back();

// 次のページへ進む
 $client->forward();

複数要素がヒットした場合

$crawler->filter('.list a')->each(function ($node) {
    // 処理
}

// 値を渡したい場合
$xxx = 50;
$crawler->filter('.list a')->each(function ($node) use ($xxx) {
    // 処理
}

// 値を受け取りたい場合
$xxx;
$crawler->filter('.list a')->each(function ($node) use (&$xxx) {
    // 処理
}

スポンサーリンク