フォームも操作できるGoutte(PHP)でWebスクレイピングをしてみる
概要
Goutte (グット)
Goutteは、PHPでスクレイピングするためのライブラリ。phpQueryよりも若干パフォーマンスは悪いみたいですが、機能は多いです。フォームの値を変更したり、リンク先のページも読み込めたりします。
phpQueryと同じく、要素の指定方法はjQueryやCSS間隔で指定することが出来ます。
Webスクレイピングをしてみる
1. 準備&ダウンロード
Githubではコマンドからのインストール方法しか記載されていませんが、一応まだgoutte.pharを直接ダウンロードできるリンクは残っていますのでそこからダウンロードすることができます。ただ、このファイルのバージョンはわかりません。最新のバージョンがいい方はコマンド(Composer)からのインストールをおすすめします。
ファイルの読み込みとライブラリを使用するための記述を行います。
PHP
<?php
require_once('goutte.phar');
// Goutte使用準備
use Goutte\Client;
$client = new Client();
2. URLの指定
次にスクレイピングしたいURLを指定します。今回はYahoo!JAPANトップのニュース一覧を取得します。
PHP
// UA指定
$client->setHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36');
// URL
$url= 'http://www.yahoo.co.jp/';
$crawler = $client->request('GET', $url);
UAはChromeにしています。基本UA指定は不要ですが、Yahoo!の場合は指定しないと取得できないみたいなので今回は指定しています。
3. データ処理
PHP
// データ処理
$i = 0;
$data = array();
$crawler->filter('#topicsfb .emphasis li')->each(function($node) use (&$data, &$i){
$data[$i]['link'] = $node->filter('a')->attr('href'); //リンク取得
$data[$i]['title'] = $node->filter('a')->text(); //リンクテキスト取得
$data[$i]['title'] = str_replace(array('写真','動画','NEW'), ", $data[$i]['title']); //不要テキスト削除
$i++;
});
// データ表示
foreach ($data as $key => $val){
echo $val['title'].' ('.$val['link'].')<br>';
}
// 配列の中身を表示
echo '<pre>'; var_dump($data); echo '</pre>';
filterで要素を指定し、その要素をeachでループしています。ループ外で定義した変数・配列は、useで使用宣言しないとループ内で使えないみたいです。
その他使用方法
絞り込み
PHP
filter("p.class")->eq(0) //1番目取得
filter("p.class")->parents() //親要素取得
filter("p.class")->children() //子要素取得
filter("p.class")->first() //最初の要素
filter("p.class")->last() //最後の要素
フォーム操作
PHP
$form = $crawler->filter('#form')->first()->form(); // フォームを取得
$form['inputname']->setValue('値'); // 値をセット
$form['selectname']->disableValidation()->select(100); // セレクト要素のセット
$crawler = $client->submit($form); // フォーム送信処理
ページ推移
PHP
$link = $crawler->filter('a')->link(); //リンク取得
$crawler = $client->click($link); //クリックイベント実施
echo $crawler->html(); //HTML表示