書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
Webスクレイピングを行う(Goutte)
HTMLから必要なデータを抽出する「Webスクレイピング」を手軽に行えるライブラリ「Goutte」の基本的な使い方を説明する。書籍転載の2本目(書籍内の番号は「88」)。
書籍転載について
ご注意
本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。
Goutteは、手軽にWebスクレイピングが行えるライブラリです。Webスクレイピングとは、Webページにアクセスして、そのHTMLから必要なデータを抽出する処理のことです。Googleなどの検索エンジンは、この技術を応用して、Web上のデータを採取しています。
- 名称: Goutte
- URL: https://github.com/fabpot/goutte
- インストール方法: include_path に配置
- ファイル: goutte.phar
インストール
Goutteは、goutte.pharという1つのファイルにまとめられていますので、このファイルをダウンロードして、コピーするだけで利用可能です。
Webページから観測データを取得する
リスト88-1は、http://www.time-j.net/ というサイトから、東京の過去36時間の天気情報を取得して、データ部分のみを表示するサンプルです(図88-1)。
<?php
require_once 'goutte.phar';
use Goutte\Client;
// 1Goutteオブジェクトの生成
$client = new Client();
// 2http://www.time-j.net/から「東京の過去36時間の天気」を取得
$crawler = $client->request('GET',
'http://www.time-j.net/WorldTime/Weather/Weather36h/Asia/Tokyo');
// 3「東京の過去36時間の天気」テーブルを指定
$dom = $crawler->filter('table.wtable td');
$ary = array(); // 「現地時間」、「天気」の保存用
$time = ""; // 「現地時間」の一時保管用
$ix = 0; // 現在行
// 4テーブルから1行ずつ取得する
$dom->each(function ($node) use (&$ix, &$time, &$ary) {
// 5「現地時間」を取得する
if (($ix % 8)==0) {
$time = $node->text();
}
// 6「天気」を取得する
else if ((($ix-1) % 8)==0) {
$ary[ $time ] = $node->text();
}
$ix++;
});
// 7現地時間、天気を表示する
foreach ($ary as $t => $w){
echo $t. " ". $w. "<br />";
}
|
コードの最初に、Goutteオブジェクトを生成し(1)、requestメソッドで、スクレイピングを行うURLを指定します。requestメソッドの戻り値は、Symfony¥Component¥DomCrawler¥Crawlerというオブジェクトとなります。
「東京の過去36時間の天気」のHTMLソースは、<table> タグになっており、wtableというクラス属性が付けられています。そこで、Crawlerオブジェクトのfilterメソッドで、そのテーブルの<td> タグ部分のみを指定します(3)。こうすると、<td>タグがDOMツリーのオブジェクトとして取得できます。Goutteでは、このようなCSSセレクタを使って、特定の部分を抽出することが可能です。
取得したdomオブジェクトから、「現地時間」と「天気」を取得します(4)。ここでは、eachメソッドを使って、domオブジェクトからタグの要素を1つずつ抽出しています。
「現地時間」と「天気」は、それぞれ0番目、8番目、16番目……、1番目、9番目、17番目……に出現しますので、eachメソッドからコールバックされる無名関数のなかで、2つの値を、一時保存用の配列に格納しています(56)。
最後に、連想配列に格納したデータを、すべて表示します(7)。
【NOTE】無名関数
PHPでは、バージョン5.3.0から無名関数が使えるようにりました。無名関数は、関数名を指定せずにfunctionという名前だけで関数を作成するものです。リスト88-1のサンプルのように、関数内でさらに関数を作成するクロージャとしてよく利用されます。
なおクロージャ内は、外側の関数とは、変数のスコープが異なります。クロージャ内でも利用するには、無名関数に、use(変数)をつけて宣言する必要があります。このような変数を、レキシカル変数と呼びます。またレキシカル変数は、値渡しですので、参照渡しで利用するには、変数名に&を付ける必要があります。
※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
1. スクレイピング/DOM操作をjQuery風に行う(phpQuery)
Webサイトから情報を抽出する「Webスクレイピング」や、HTML内の各要素にアクセス/操作する「DOM操作」を、phpQueryを使ってjQuery風に行う方法を説明する。書籍転載の1本目(書籍内の番号は「70」)。
2. 【現在、表示中】≫ Webスクレイピングを行う(Goutte)
HTMLから必要なデータを抽出する「Webスクレイピング」を手軽に行えるライブラリ「Goutte」の基本的な使い方を説明する。書籍転載の2本目(書籍内の番号は「88」)。
3. MVCフレームワークを使ってアプリケーションを作成する(CakePHP)
PHPのMVCフレームワークとして人気のある「CakePHP」の基本的な使い方を説明する。書籍転載の3本目(書籍内の番号は「94」)。
4. CakePHPのモデルとビューを利用する
CakePHPのモデルを定義して、ビューと組み合わせる方法を説明。また、Formヘルパーを使って入力チェックなどを行う方法も解説する。書籍転載の4本目(書籍内の番号は「95」)。
5. 高速で軽量なフレームワークFuelPHPを使う
高度なWebアプリ開発に向いている、高速で軽量なフレームワーク「FuelPHP」の基本的な使い方を説明する。書籍転載の5本目(書籍内の番号は「96」)。