データ取得をPHP Simple HTML DOM Parserに

    今まではPHPのcURLで、
    取得→ローカル保存→整形して出力
    の形式をとっていたけど、最近は「スクレイピング」って立派な名前がついて(知らないだけ?)
    便利なライブラリが出てるとのこと。

    中身はfile_get_contentsらしいってーから悩んだけど、
    使いやすそうだったから試してみることに。

    細かいとこは加齢にスルーですよ。
    わかりやすい参考サイトがあるのでそちらドゾ。

    要件

    • 情報は外部取得(http
    • リアルタイムではなく、cronで数時間おきに取得→サーバーにファイルで保存
    • 複数ページで呼ぶので、php配列とかだとイトオカシ

    実践

    <?php
    require_once './simple_html_dom.php';//読み込む
    $html = file_get_html('http://example.com');//ここスクレイピングするよ
    foreach($html->find('.hoge tr') as $article) {//table.hogeのtrをクルクル
        $item['a'] = $article->find('td', 0)->plaintext;//td内だけ(タグ抜き)を$item配列に
        $item['b'] = $article->find('td', 1)->plaintext;
        $item['c'] = $article->find('td', 2)->plaintext;
        $item['d'] = $article->find('td', 3)->plaintext;
        $item['e'] = $article->find('td', 4)->plaintext;
        $item['f'] = $article->find('td', 5)->plaintext;
        $item['g'] = $article->find('td', 6)->innertext;
        $articles[] = $item;//多次元(連想?)配列に
    }
    file_put_contents("hoge.txt", serialize($articles));//hoge.txtにシリアライズして保存
    $html->clear;//おまじない(メモリ解放。お約束の模様)
    

    こんなん感じで書いておき、cronで回す。
    外から叩かれてスクレイプ元に負荷かからないよう、.htaccessで制限かけたり(←心配性

    配列のままファイルに置いとくには、上記みたいにfile_put_contents(serializeとすると便利とのこと。
    んで、表示(展開)側

    <?php
    $item = unserialize(file_get_contents("hoge.txt"));//保存してあるデータをアンシリアライズ
    function hyouji($count) {//表示用関数
        global $item;//関数内側なら不要だぬ
        echo "<li>{$item[$count]['a']}</li><li>{$item[$count]['c']}</li><li>{$item[$count]['g']}</li><li>{$item[$count]['b']}</li>";
    //表示する構造とか
    }
    ?>

    後は<ul><?php hyouji(2); ?></ul>とか書いとくと、
    3番目の<tr>に入ってたデータがリストで表示されちゃったりします。
    嗚呼激しく便利w