Diggin 0.4.0リリース

3ヶ月以上前にバージョン0.3としてリリースしたDigginパッケージを、この度最新のリビジョン分を反映し、ヴァージョン0.4としてリリースします。また、サイトの方リニューアルしました。(デザインだけ)
http://diggin.musicrider.com/

もうそろそろライブラリ群の説明をちゃんと書きたいですです。
ちなみに、今回のバージョンでサイズは150kb(ディスク上のサイズ276kb)となります。また、前回省いちゃってたdemoをちゃんと入れています。


前回のはPHPライセンスとかpackage.xmlに書いてましたがあれは嘘で、Digginは基本的にnew BSD Licenseです。しかしながら、Diggin_Scraper_Adapter_HtmlscrapingだけはLGPLHTMLScraping Classを改訂したものなので、別パッケージとして配布します。(ライセンス的にこれでいいんだっけかな?というか、文字コード判定のとこだけでいいので新BSDにならないかなあ(;´Д`))
上記のためpearインストールの場合、

pear install http://diggin.musicrider.com/Diggin.tgz
pear install http://diggin.musicrider.com/Diggin_Scraper_Adapter_Htmlscraping-0.1.0.tgz

とコマンドを打ってインストールしてください。あと、Net_Url2あたりが必要かもしれない。


前回からの追加コンポーネント

  • Diggin_Service_Wedata
  • Diggin_Http_Client_Adapter_TestPlus
  • Diggin_Http_CookieJar_Loader_Firefox3
  • Diggin_Json

などです。上3つに関しては、最近のエントリで述べたものをライブラリぽっく修正していったやつです。


修正は、Diggin_Scraperを中心に行っていたんですが、
0.3からの主な変更点は

  • ブロック構造(構造体ちっく)での取得(@see http://en.yummy.stripper.jp/?eid=800109)
  • 擬似的なarrayショートシンタクス宣言有無によるコードリファレンスというか、current or 配列での取得。

ブロック構造でぶっこ抜くためにひたすら再帰処理してます。なので重いかもしれない。
ちなみにこれを実装した1週間後にクロージャがPHP5.3で実装ってことになってので「ぁ、あー」とか思ってます。


今の段階で、「きょうの Web::Scraper めざまし占いカウントダウンを取得」
http://subtech.g.hatena.ne.jp/miyagawa/20080808/1218136260
をまねしようとすると以下のようなコード。

<?php
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

$url = 'http://www.fujitv.co.jp/meza/uranai/';

try {
    $ranking = new Diggin_Scraper_Process();
    $ranking->addProcess('.', 'rank => [@background, "Digits"]')
            ->addProcess('.//img', 'star => @alt', 'image => @src')
            ->addProcess('.//td[@class="text"]', 'text => TEXT')
            ->addProcess('.//td[@class="lucky"]', 'lucky => TEXT');
    
    $scraper = new Diggin_Scraper();
    $scraper->process('//td[@class="day" and @height < 100]', 'date => "TEXT"')
            ->process('//table[@width="306"]', array('ranking[]' => $ranking))
            ->scrape($url);
} catch (Diggin_Scraper_Exception $e) {
    die($e->getMessage());
}

Zend_Debug::dump($scraper->results);



結果

array(2) {
  ["date"] => string(9) "8月15日"
  ["ranking"] => array(12) {
    [0] => array(5) {
      ["rank"] => string(2) "01"
      ["star"] => string(9) "やぎ座"
      ["image"] => string(61) "http://www.fujitv.co.jp/meza/uranai/item/conste_capricorn.gif"
      ["text"] => string(135) "前向きな姿勢を評価され人気者。あなたの言葉でみんなが元気に。何事にも自信を持ちチャレンジ。"
      ["lucky"] => string(30) "直感を信じて行動する"
    }
    [1] => array(5) {
      ["rank"] => string(2) "02"
      ["star"] => string(12) "おうし座"
      ["image"] => string(58) "http://www.fujitv.co.jp/meza/uranai/item/conste_taurus.gif"
      ["text"] => string(66) "気になる異性と急接近。踏み込んだ話題がカギ。"
      ["lucky"] => string(9) "試供品"
    }
(以下省略)



Diggin_Jsonは、WebScraper IDEにて生成されるjsonをDiggin_Scraperに解釈させるためのものです。WebScraper IDEがFirefox3.0.0までの対応だったので、3.0.1だとインストールできないため作者の方に修正をお願いしてたんですが、まだ作者の来週が来ていないようです。


なので再検証ができてないのですが、webscraper.jsのエントリでも例示されているebayの場合以下の通り。要するにJSONを渡すだけ。

<?php
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

$url = 'http://search.ebay.com/apple-ipod-nano_W0QQssPageNameZWLRS';
$json = <<<JSON
{
    'table.ebItemlist tr.single': {
        'auctions[]': {
            'h3.ens>a': {
                    description: 'TEXT',
                    url: '@href'
            },
            'td.ebcPr>span': {
                price: "TEXT"
            },
            'div.ebPicture >a>img': {
                image[]: "@src"
            }
        }
    }
}
JSON;

$scraper = new Diggin_Scraper();
$scraper->changeStrategy("Diggin_Scraper_Strategy_Selector");
$scraper->process($json)
        ->scrape($url);
        
Zend_Debug::dump($scraper->results);