Goutte Web スクレイピング
複雑な Goutte ファイル作成 その2
複雑な Goutte ファイル goutte-manepa-keizai.php 作成を続けます。
作成ファイル内容は、
63Pear Village に戻り
左サイドナビ「PHPlot グラフ表示」の中の
複雑な Goutte PHP ファイル
から見てください。
各 定数、変数、配列の働き
- 定数 $patern
日付を見付けるための正規表現を定義します。
経済指標カレンダーページでは日付は、7/13(金) のように書かれています。
よって、"7/13(" を見付ければこれは日付だと判定できます。
この判定基準が $patern です。
たとえば、郵便番号(数字3桁-数字4桁)の正規表現なら
$patern = '/[0-9]{3}-[0-9]{4}/';
となります。
正規表現パターンが "/" で挟まれてますが、PCRE系正規表現のお約束ごとでした。
最初の月の数字は1 or 2桁、同じく日付の数字も1 or 2桁、ですから、どちらも、
[0-9]{1,2}
と表現すれば良いですね。
よって
$patern = '/[0-9]{1,2}/[0-9]{1,2}/';
でも、困りました "7/13(" を見付けたいのですよね、どうしても中央に"/"を入れる必要があります。
正規表現パターンは "/" で挟まれるのがお約束でした。
よって、正規表現パターン終わりの "/" と判断されないよう"\"でエスケープして"\/"とする必要があります。
また、"(" は正規表現パターンをグループ化するために使われますので同じく、"\(" とします。
故に、
$patern = "/[0-9]{1,2}\/[0-9]{1,2}\(/";
となるのですが、正規表現パターンを "/" で挟むのは慣例的な PCRE 系正規表現の約束ごとのようです。
私は、パイプ "|" で挟むのが好きです。
そうすると、
$patern = "|[0-9]{1,2}/[0-9]{1,2}\(|";
となり、ちょっとだけ短くなります。 - 変数 $frag、配列 $td
指標中の先頭文字が(日) or (豪) ならば、
変数 $frag = 3;
とします。
3 とするのは、各指標には
前回(訂正)、予想、結果の3種類のデ-タ
を取得する必要があるからです。
例えば、(日) の文字を見付けたらその後の、3種類のデ-タを取得し、配列 $td に保存します。 - 変数 $tr
正規表現パターン $patern に一致するとそれは日付と判定されます。
これを一旦、変数 $tr に保存します。 - 配列 $td0
時刻と重要度はその直後に判定する、指標中の先頭文字が(日) or (豪) なのかは不明ですので、 一旦、配列 $td0 に仮保存します。
指標に、(日) or (豪) があれば、その2つ前が必要な時刻ということになります。
無名関数の作成
無名コ-ルバック関数 function($e) の中身を作成していきます。
$crawler
-> filter('td')
//<td>を見付けるたびに実行
-> each(
function($e) use (&$td,&$td0,&$frag,$patern,&$tr){
・・・・・・
}
CSS セレクタ「td」を指定して要素を取出す filter メソッドを使用して、
<td>・・・・・・・</td>
の構造になっている部分を探し、見付けたら抽出した要素に対して each メソッドを使用します。
すなわちこのメソッドは<td>タグを見付けるたびに
コ-ルバック関数 function($e){ }
をスタ-トさせます。
今回の場合<td>タグの中身を見付けてもそれが必要かどうかは不明です。
よって要不要を判定します。
要不要判定1
<td>タグが見つかったらその内容を取得します。
$text = $e->text();
もし $frag が 3~1 であれば、指標中の先頭文字が(日) or (豪) のいずれかですので、
case 文で $text を配列 $td[] に保存し、$frag を1つ減らします。
switch($frag){
case "3"://前回を取込
$td[] = '<td class="las_z">'.$text."</td>";
$frag = 2;
break;
case "2"://予想を取込
$td[] = '<td class="las_ky">'.$text."</td>";
$frag = 1;
break;
case "1"://結果を取込
$td[] = '<td class="las_ky">'.$text."</td></tr>";
$frag = 0;
}
$frag = 3 の時は前回
$frag = 2 の時は予想
$frag = 1 の時は結果
の内容を取込します。
取り込む時ついでにクラス "las_ky" も入れ込みました。
クラスの内容は後述します。
要不要判定2
日付判定
PHP 関数 preg_match を使用して、日付判定をします。
ここでの日付正規表現は
$patern = '/[0-9]{1,2}/[0-9]{1,2}/';
でした。
正規表現を利用することで、文字列の検索や置換を行うことができます。
パターンにマッチした場合は 1 を返し、マッチしなかったら 0 を返してくれます。
$hantei = preg_match($patern,$text);
if($hantei === 1){
$tr = '<tr><td class="day">'.$text."</td>";
}
<td>タグ内の内容が日付だったらこれを日付変数 $tr に
クラス "day" も含めて保存します。
要不要判定3
'(日)' '(豪)' 判定
PHP 関数 strpos( ) を使用して、日・豪 判定をします。
strpos( ) は文字列内の部分文字列が最初に現れる場所を見つけてくれます。
もし先頭(1文字目)に見付けたら 0 を返します。
N文字目に見付けたら N-1 を返します。
今回は先頭に見付けることを期待していますので、日 or 豪 の文字があれば 0 が返るはずです。
$b = strpos($text,'(日)');
$b1 = strpos($text,'(豪)');
日 or 豪 の文字があれば
日付情報 $tr、時刻情報 $td0[0]、指標 $text (クラス "sihyo" 含めて) を $td[] に順に保存し、$frag = 3 とします。
if($b === 0 or $b1 === 0 ){
$td[] = $tr;//日
$td[] = $td0[0];//時刻
$td[] = '<td class="sihyo">'.$text.'</td>';//指標
$frag = 3;
日 or 豪 の文字がなければ、指標の2つ前の情報を暫定取得します。
要するに、時刻情報(クラス "day" 含めて)を暫定取得します。
$td0[0] = $td0[1];//時刻
$td0[1] = '<td class="day">'.$text.'</td>';//時刻 or 重要度
これで、スクレ-ピング部分のファイルは作成完了です。
引き続き、スクレ-ピング部分を HTML で再表示します。
複雑な Goutte ファイル作成 その3 に進む
複雑な Goutte ファイル作成 に戻る
Goutte Web スクレイピング概要 に戻る