Goutte Web スクレイピング

単純な Goutte ファイル作成

単純な Goutte ファイル scraping-mmlbbs21.php を作成します。
作成ファイル内容は、
63Pear Village に戻り
左サイドナビ「Goutte Web スクレイピング」の中の
単純な Goutte PHP ファイル
から見てください。
Composerのオートロードを有効にします。
require 'autoload.php';
use Goutte\Client;
Composerのオートロードを使用せず、
require_once 'fabpot\goutte\Goutte\Client.php';
の様な書き方では残念ながら動きません。
Client.php の中で使用している各パッケ-ジ類をオートロード機能を利用して呼び出しているからのようです。
まずは、スクレイピングしたい WEB サイトの URL を設定します。
今回は、対象 URL を
$url = "https://sakuramml.com/mmlbbs6/";
としてみました。
どんなサイトなのか取り敢えず見てみましょう。
サクラ曲掲示板 part.6
このサイトは、エディタに「ドレミ」と書けば、その通りに音楽を演奏することができるソフトを提供しているサイトです。
いろいろな音楽をワープロ感覚で作ることができます。
「サクラ曲掲示板」に行くと、曲を聞いたり、作曲された音楽デ-タをダウンロードすることができます。
やっと Web スクレイピングの準備が完了です。

Goutte インスタンス作成

Goutte\Client のインスタンスを生成します。
$client = new Client();
とここで問題発生です。
確かに、レンタルサ-バ内ではこれでうまくいくのですが、Windows XAMPP からはうまくいかないのです。
うまく動くのは、
http://・・・・・・・・・
のサイトのみ、
https://・・・・・・・・
の SSL 認証サイトではうまく動きません。
これは Windows 環境でクライアント証明書が見つけられないために発生する問題のようです。
そこで、サーバー証明書の検証を行わないようオプションを設定をします。
Goutte HTTPS でのリクエスト SSL 証明書エラー
へ行くとその対処方法が書いてあるのですがこれが難しい。
インスタンスを作成したら、
GuzzleHttp の RequestOptions の VERIFY を false にする
すなわち、
$client->setClient(new \GuzzleHttp\Client( [\GuzzleHttp\RequestOptions::VERIFY => false,] ));
を追加しろと書いてあるのですが、これを記述すると、私が使用しているエディタ Dreamweaver CS6 では エラ表示 Syntax Error がでるのです。
エディタが古いと言われればそれまでなのですが、これがわからない。
実は、PHP5.4 以降は配列に [ ] が使えるようになったのです。
だから上記の書式は正しいのですが、私のエディタは古いのでエラ-を出していたのです。
PHP5.3 以前でも使える書式にしましょう。
$client->setClient(new \GuzzleHttp\Client( array(\GuzzleHttp\RequestOptions::VERIFY => false,) ));
これで、SSL 認証を回避することになります。
本来は危険性もあるのですが、安全であると手動で確認している WEB サイトからスクレイピングするわけですから SSL 認証をしなくても良いと個人的には思います ・・・・
ちなみに、\GuzzleHttp のなかの RequestOptions.php のなかに、RequestOptions クラスがあり VERIFY 定数は'verify'に設定されています。
クラス定数はわざわざインスタンスを作成しなくても、
クラス名::定数名
の形式でアクセスできます。
よって
\GuzzleHttp\RequestOptions::VERIFY => false
とすれば、VERIFY 定数を 'false' にすることができるのですね。
次ぎに request メソッドを使用して
$crawler = $client->request('GET', $url);
指定した URL の HTML 内容を取得します。

無名関数を使用して必要な情報を抜き出す

CSS セレクタ「table tr」を指定して要素を取出す filter メソッドを使用して、
<table><tr>・・・・・・・</tr></table>
の構造になっている部分を探し、見付けたら抽出した要素に対して each メソッドを使用します。
すなわちこのメソッドは< tr>タグを見付けるたびに
コ-ルバック関数 function($e){ }
をスタ-トさせます。
$crawler
-> filter('table tr')
-> each(function($e) {
・・・・・・・
}

無名関数の作成

無名コ-ルバック関数 function($e) の中身を作成していきます。
今回の場合<tr>タグを見付けるとその中に6個の<td>タグが見つかります。
このように複数のタグのN番目にアクセスしたい時は、eq()メソッドを使用します。
eq(N) で 0 から数えてN番目の要素を抽出することができます。
<tr>を見つけたら
$td = $e -> filter('td');
$count = $td -> eq(0) -> text();
$title = $td -> eq(1) -> text();
とすると0番目の<td>タグのテキスト内容が $count に保存されます。
次ぎに、1番目の<td>タグのテキスト内容が $title に保存されます。
さらには1番目の<td>タグの中には <a href='***.php'>のような <a>タグが存在し、href 属性を取得する必要性もあります。
ただ、< a>タグが存在しない場合もありますので、その対応もする必要があります。
href 属性を取り込む変数 $link を規定します。
href 属性がないときもありますので取り敢えず、ヌルにしておきます。
$link = "";
$o = $td
-> eq(1) -> filter('a')
-> extract(array('href'));
とします。
extract( )メソッドを使用するとタグの属性を取り出すことができます。
タグの属性がないときは $o はヌルですから属性が取得できたとき
if ($o) { $link = $o[0]; }
とします。
後は作者名が、eq(2) にありますので、
$author = $td -> eq(2) -> text(); とすれば、目指す情報を取り出す事ができました。
最後に、取得した内容を表示して終わりです。
echo $title."<br>&emsp;".$author. "<br>&emsp;&emsp;".$link."<br><br>";
全角空白文字 &emsp; を出力して行頭を一文字ずつ下げて表示してみました。

引き続き、ログインが必要なペ-ジの Web スクレイピングファイルを作成します。


ログインが必要な Goutte ファイル作成 に進む
Goutte Web スクレイピング概要 に戻る

63PearVillage に戻る