ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    CodeIgniterでphpQueryを使ってスクレイピングする方法

    このエントリーを含むはてなブックマーク はてなブックマーク - CodeIgniterでphpQueryを使ってスクレイピングする方法 あとで読む
    ときどき、HTML形式で提供されているデータを、スクレイピングしたくなります。

    以前は、「PHP Simple HTML DOM Parser」を使ってみました。
    CodeIgniterでスクレイピング - 浜村拓夫の世界

    今回、別の方法を検索したら、その一つとして、「phpQuery」というライブラリーを使う方法が紹介されていました。
    phpQueryの特徴は、DOMの操作を、jQueryっぽくできることらしいです。

    CodeIgniter+phpQueryの使い方をメモしときます。

    phpQuery


    ●CodeIgniterにphpQueryを組み込む方法
    php - phpquery codeigniter howto - Stack Overflow

    インストール
    1. phpQuery-onefile.zip をダウンロードする。
    2. 展開して、 phpQuery-onefile.php を
      /your/ci/proj/application/helpers/phpquery_helper.php
      へコピーする。
    3. 普通のヘルパーのようにロードする。

    使用方法
    私が使っている、基本的な例です。

    //to load in a controller
    $this->load->helper('phpQuery');

    //I'm using phpQuery in one of my libraries. So, load like this..
    $ci =& get_instance();
    $ci->load->helper('phpQuery');

    //now use phpQuery like normal.
    phpQuery::newDocumentHTML('
    This is a test.
    $testElement = pq('#test');

    echo $testElement->html(); //This is a test.


    代案
    普通の古いやり方で使うこともできます。
    include_once('path/to/phpQuery-onefile.php');



    英語の原文では、
    「/your/ci/proj/application/helpers/phpQuery_helper.php」
    という具合に、ヘルパーのファイル名をキャメルケース(単語を連結して、語頭を大文字にする表記)で書いていましたが、
    CodeIgniterでロードエラーが生じたので、上記の翻訳文では、全部小文字にしました。
    =「phpQuery」の、大文字の「Q」を、小文字の「q」に変更しました。

    CodeIgniterのローダークラスが、仕様変更されたとか?
    調べてないけど、phpQueryのロードや実行の際に、他にもエラーが出るようなら、大文字の「Q」を小文字の「q」に変更して試してみると良いと思います。


    ●phpQueryのタイポ(誤植)
    さっそく、phpQueryを使ってみると、PHPのエラーメッセージが出ました。

    A PHP Error was encountered

    Severity: Notice

    Message: Undefined variable: hltml

    Filename: helpers/phpquery_helper.php

    Line Number: 517



    「$hltml という変数はないよ」とのこと。

    517行目を見てみると…
    if (strpos($hltml, '<html') === false) {


    これは、$hltmlじゃなくて、$htmlの間違いでした。
    =変数名に、余計な「l」が混入していて、誤植(タイポ)になってました。

    $htmlに訂正したら、phpQueryが動きました。

    一応、作者のTobiasz Cudnikさんには報告したけど、直してもらえるかな?


    ●文字化け
    phpQueryのタイポを修正して、動いたのはいいけど、今度は、スクレイピングした日本語が文字化けしていて、読めません!
    入力や出力の文字コード指定を、あれこれイジってみても、文字化けが直りません!

    原因は、初歩的なミスでした。orz

    「phpQuery-onefile.zip」を解凍して、出てきたファイル「phpQuery-onefile.php」の文字コードが、「UTF-8」ではなく「S-JIS」になってました。
    =Windows上で解凍したため?

    phpQueryのファイルの文字コードをUTF-8N(BOM無し)に変更したら、パースした日本語の文字化けが解消されました。
    めでたし、めでたし!


    ●phpQueryの使い方
    「phpquery 使い方」でGoogle検索すると、分かりやすい説明記事がヒットしました。

    『phpQuery』の基本的な使い方 - Ouka Studio

    jQueryオブジェクトとは異なり、phpQueryオブジェクトは関数オブジェクトではないので注意が必要だが、あとはほとんど同じ。

    phpQueryオブジェクトはあくまで配列オブジェクトなので、以下のようにループを回せる。



    スクレイピング応用編-phpQuery- | PHPサンプル実験室

    読み込むときのメソッドですがその他たくさんありますが必要に応じて使ってください。
    基本的にphpQuery::newDocument($html, $contentType = null)かphpQuery::newDocumentFile($file, $contentType = null)で充分だと思いますね。



    phpQuery マニュアル
    http://code.google.com/p/phpquery/wiki/Manual

    phpQueryは、動作が重たいという意見もありました。

    ・phpQueryのメリット → DOMをjQueryのように扱える。
    ・phpQueryのデメリット → 動作が重たい?

    さて、スクレイピングは、うまくできるかな?



    反復学習ソフト付き 正規表現書き方ドリル (WEB+DB PRESS plus)
    杉山 貴章
    技術評論社
    2010-12-22
    2919円






    関連記事

    コメント

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/967-992e7070

    FC2Ad