Goutte Web スクレイピング

複雑な Goutte ファイル作成 その2

複雑な Goutte ファイル goutte-manepa-keizai.php 作成を続けます。
作成ファイル内容は、
63Pear Village に戻り
左サイドナビ「PHPlot グラフ表示」の中の
複雑な Goutte PHP ファイル
から見てください。

各 定数、変数、配列の働き

  1. 定数 $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}\(|";
    となり、ちょっとだけ短くなります。

  2. 変数 $frag、配列 $td

    指標中の先頭文字が(日) or (豪) ならば、
    変数 $frag = 3;
    とします。
    3 とするのは、各指標には
    前回(訂正)、予想、結果の3種類のデ-タ
    を取得する必要があるからです。
    例えば、(日) の文字を見付けたらその後の、3種類のデ-タを取得し、配列 $td に保存します。

  3. 変数 $tr

    正規表現パターン $patern に一致するとそれは日付と判定されます。
    これを一旦、変数 $tr に保存します。

  4. 配列 $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 スクレイピング概要 に戻る

63PearVillage に戻る