PHP
GoutteでWebスクレイピング
はち
更新日:2021/08/04
オリックスがやっと勝てるようになってきて少し嬉しい、はち です。
Webスクレイピングに興味を持ちました
大きな・有名なWebサイトであれば、ある程度のAPIが用意されているので、色々と情報を取得するのは簡単ですが、中規模・小規模のWebサイト、WebシステムではAPIは中々用意されていないというが現状ではないでしょうか。
そのような、APIが用意されていないWebサイトから、なんとかデータを引っこ抜いてくる何かがないものかと考えました。
単純にURLを指定して「表示されたWebページにさえ欲しい情報があれば」HTMLを引っこ抜いてきて自力のルーチンで解析するのも勿論1つの手段です。
そのような動きは、Webクローラー(検索エンジンなどで採用されているものです)と同じような動きになると思いますが、それを手軽に実現できる「Goutte」と「PHPQuery」という2つのWebスクレイピングライブラリがあることを知りました。
※Webスクレイピングとは、検索エンジンなどで使用しているWebクローラーのように、Webサイトから情報を抽出する仕組みのことです。
PHP5.3でGoutteを使う
PHP5.3でGoutteを使う場合、Goutteのバージョンが1.x系のものを使えば一応は遊べます。
json形式のものをインストールしたり、色々使用方法はあるのですが、今回はパッケージがまとまっているphar形式のものを使います。
Goutteの動作要件について補足
>Goutte depends on PHP 5.5+ and Guzzle 6+.
>If you need support for PHP 5.4 or Guzzle 4-5, use Goutte 2.x.
>If you need support for PHP 5.3 or Guzzle 3, use Goutte 1.x.
最新のGoutteを使うにはPHP5.5以上、Guzzle(HTTPクライアントライブラリ)のVer6以上が必要です。
このサイトのサーバーはPHP5.2系を採用しているので、残念ながら当サーバー上で試験することは出来ません。
ので、別のサーバー(PHP5.3系実装)でGoutteを用いたWebスクレイピングをテストすることとしました。
最新のものは色々機能が追加されていたり不具合が修正されていたりするそうです。
Goutteライブラリを用意します
https://github.com/FriendsOfPHP/Goutte
ページ内にある「Installation」から少し下にある
>The phars for Goutte 1.x are also available for download
>http://get.sensiolabs.org/goutte-v1.0.7.phar
↑これがGoutte1.x系のものです。これを使えばPHP5.3でもGoutteが利用できます。
実装サンプル
せっかくなので、オリックスの成績表をスクレイピングして見ようと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//ライブラリの読み込み、使用宣言 require_once 'goutte.phar'; use Goutte\Client; //Goutteオブジェクトの生成 $client = new Client(); //クローラーに取得したいURLをぶち込みます $getUrl = 'http://baseball.yahoo.co.jp/npb/teams/11/memberlist?type=b'; //オリックス $crawler = $client->request('GET', $getUrl); //取得したいデータを指定(今回は成績表を取得します) $dom = $crawler->filter('table.NpbPlSt.mb10 td'); //初期設定用 $ary = array(); // 保持用配列 $ix = 0; // 現在の列を持つカウンタ $jx = 0; // 現在の行を持つカウンタ //取得したデータを加工する $dom->each(function ($node) use (&$ix, &$jx, &$ary){ //保持用配列に取得列を追加していく $ary[$jx][] = $node->text(); $ix++; //25個目のアイテムだったら次行へ推移 if (($ix % 25)==0) { $jx++; } }); |
取得して配列に入れ込むだけなら、なんとたったの15行で済みます(コメント除く)。すごいですね。
完成
元ページ:http://baseball.yahoo.co.jp/npb/teams/11/memberlist?type=b
元ページの表を取得・解析し、独自のグリッドを3つ追加しました。(残規定到達打席数、1試合の平均打席数、規定打席に残り何試合今のペースで出ればよいか)
本当は、動作しているものをサンプルとして用意したかったのですが、このサーバーでは用意できないのでローカルにあるサーバーで実装しました。
他のサイトとも連動して色々野球関係の物を作るのもよし、もっと実用的なAPIに変わる物を作るのも良し、ですね。