Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
書籍転載:PHPライブラリ&サンプル実践活用[厳選100]

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]

Webスクレイピングを行う(Goutte)

2014年7月29日

HTMLから必要なデータを抽出する「Webスクレイピング」を手軽に行えるライブラリ「Goutte」の基本的な使い方を説明する。書籍転載の2本目(書籍内の番号は「88」)。

WINGSプロジェクト 髙江 賢
  • このエントリーをはてなブックマークに追加

書籍転載について

 本コーナーは、技術評論社発行の書籍『PHPライブラリ&サンプル実践活用[厳選100]』の中から、特にBuild Insiderの読者に有用だと考えられる項目を編集部が選び、同社の許可を得て転載したものです。

 

 『PHPライブラリ&サンプル実践活用[厳選100]』の詳細や購入は技術評論社のサイト目次ページをご覧ください。

ご注意

 本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。

 Goutteは、手軽にWebスクレイピングが行えるライブラリです。Webスクレイピングとは、Webページにアクセスして、そのHTMLから必要なデータを抽出する処理のことです。Googleなどの検索エンジンは、この技術を応用して、Web上のデータを採取しています。

インストール

 Goutteは、goutte.pharという1つのファイルにまとめられていますので、このファイルをダウンロードして、コピーするだけで利用可能です。

Webページから観測データを取得する

 リスト88-1は、http://www.time-j.net/ というサイトから、東京の過去36時間の天気情報を取得して、データ部分のみを表示するサンプルです(図88-1)。

PHP
<?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 />";
}
リスト88-1 get_weather.php
図88-1 東京の過去36時間の天気

図88-1 東京の過去36時間の天気

 コードの最初に、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]を参照してください。

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
1. スクレイピング/DOM操作をjQuery風に行う(phpQuery)

Webサイトから情報を抽出する「Webスクレイピング」や、HTML内の各要素にアクセス/操作する「DOM操作」を、phpQueryを使ってjQuery風に行う方法を説明する。書籍転載の1本目(書籍内の番号は「70」)。

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
2. 【現在、表示中】≫ Webスクレイピングを行う(Goutte)

HTMLから必要なデータを抽出する「Webスクレイピング」を手軽に行えるライブラリ「Goutte」の基本的な使い方を説明する。書籍転載の2本目(書籍内の番号は「88」)。

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
3. MVCフレームワークを使ってアプリケーションを作成する(CakePHP)

PHPのMVCフレームワークとして人気のある「CakePHP」の基本的な使い方を説明する。書籍転載の3本目(書籍内の番号は「94」)。

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
4. CakePHPのモデルとビューを利用する

CakePHPのモデルを定義して、ビューと組み合わせる方法を説明。また、Formヘルパーを使って入力チェックなどを行う方法も解説する。書籍転載の4本目(書籍内の番号は「95」)。

書籍転載:PHPライブラリ&サンプル実践活用[厳選100]
5. 高速で軽量なフレームワークFuelPHPを使う

高度なWebアプリ開発に向いている、高速で軽量なフレームワーク「FuelPHP」の基本的な使い方を説明する。書籍転載の5本目(書籍内の番号は「96」)。

サイトからのお知らせ

Twitterでつぶやこう!