WordPress覚書 その2 「タイムスタンプを比較してスクレイピング処理」

20160330

やりたいこと(処理の流れ)

大まかな処理の流れとしては以下のとおり

  1. 値を保存するテキストファイルを用意
  2. テキストファイルと現在の日付(タイムスタンプ)を比較する
  3. テキストファイルのタイムスタンプ(日付)が古い場合、スクレイピング処理を行いテキストファイルに値を書き込み保存する
  4. 3の処理後、テキストファイルの内容を読み込み出力する
  5. テキストファイルと現在のタイムスタンプ(日付)が等しい場合、テキストファイルの内容を読み込み出力する

テキストファイルを読み込む

WordPressでは下記の方法で外部ファイルを読み込んだり書き込んだりできる。

    <?php
      // テキストファイルのディレクトリを指定
        $fileDir = get_template_directory() .'/hogehoge.txt';

        // 読み込み -> 画面に出力
        echo file_get_contents( $fileDir ); 
    ?>

テキストファイルに書き込む

さらに書き込むときはこう。

    <?php
      // テキストファイルのディレクトリを指定
        $fileDir = get_template_directory() .'/hogehoge.txt';

        // 書き込む内容を設定
        $addText = "hello world";

        // テキストファイルに書き込む
        file_put_contents($fileDir,$addText);
    ?>

スクレイピング処理

js、php等色々あるっぽいけど、Wordpressに埋め込むということと、
なるべくお手軽に実装したかったのでphpQueryを選択。

参考:スクレイピング/DOM操作をjQuery風に行う(phpQuery) – Build Insider

基本下記の記述になる。

<?php
    // phpQueryをrequireる
    require_once("phpQuery-onefile.php");

    // 取得先を定義
    $HTMLData = file_get_contents('取得先のURL');

    // DOM変換
    $phpQueryObj = phpQuery::newDocument($HTMLData);

    // 出力
    echo $phpQueryObj['抽出したいDOMを指定']->text();

?>

まとめ

で、自分のやりたいことをまとめるとこうなった。
ちなみに今回は特定のページの為替相場情報を持ってくるものを想定。

<?php
  // テキストファイルのディレクトリを指定
    $fileDir = get_template_directory() . '/soba-data.txt';

    // 本日
    $today = date("Y/m/d");

    // テキストファイルのタイムスタンプ取得
    $fileDate = date("Y/m/d", filemtime($fileDir));

  // タイムスタンプ比較
    if( strtotime($today) > strtotime($fileDate) ) {

    // ファイルのタイムスタンプが本日より前だった場合

        // スクレイピング開始
        require_once("phpQuery-onefile.php");
        $HTMLData = file_get_contents('取得先URL');

        // DOM変換
        $phpQueryObj = phpQuery::newDocument($HTMLData);

        // データ抽出
        $sobaData = $phpQueryObj['#soba li']->text();

        // ドル相場
        $sobaDataUSD_strt = strpos($sobaData, '$');
        $sobaDataUSD_end = strpos($sobaData, ')', $sobaDataUSD_strt);
        $sobaDataUSD = substr($sobaData,$sobaDataUSD_strt,$sobaDataUSD_end - $sobaDataUSD_strt + 1 );

        // ユーロ相場
        $sobaDataEUR_strt = strpos($sobaData, '€');
        $sobaDataEUR_end = strpos($sobaData, ')', $sobaDataEUR_strt);
        $sobaDataEUR = substr($sobaData,$sobaDataEUR_strt,$sobaDataEUR_end - $sobaDataEUR_strt + 1 );

        // 円相場
        $sobaDataJPY_strt = strpos($sobaData, '¥');
        $sobaDataJPY_end = strpos($sobaData, ')', $sobaDataJPY_strt);
        $sobaDataJPY = substr($sobaData,$sobaDataJPY_strt,$sobaDataJPY_end - $sobaDataJPY_strt + 1 );

        // 整形処理(仮)
        $sobaText = $sobaDataUSD . "
" . $sobaDataEUR . "
" . $sobaDataJPY;

        //  ファイル書き込み
        file_put_contents($fileDir,$sobaText);

        // 取得 -> 出力
        echo file_get_contents( $fileDir );

    } else {

    // ファイルのタイムスタンプが本日と同じか、後だった場合

        // 取得 -> 出力
        echo file_get_contents( $fileDir );
    }
?>

おわりに

今後使う機会があるかどうかは不明だけど、色々と勉強になりました。
用法用量をよく守って正しくおつかいください。