Web::Scraperを読みながら

Web::Scraperのソースを題材にして、perlで知らなかったことをメモしていく。

Web::Scraperのサンプルコード

http://e8y.net/mag/013-web-scraper/
を参考に、ちょっと改変

use Web::Scraper;
use URI;

# 価格部分を yen という名前で取るスクレイパーを作成
my $scraper = scraper {
   process '#btAsinTitle', 'yen' => 'TEXT';
   result 'yen';
};

# 悪魔の箱ページのURLオブジェクトを、
my $uri = URI->new('http://www.amazon.co.jp/o/ASIN/B000WQKBE2/');

# 先ほどのスクレイパーに渡す。(スク

ソースコードを追いかけてみる

useすると
sub import {
    my $class = shift;
    my $pkg   = caller;

    no strict 'refs';
    *{"$pkg\::scraper"} = \&scraper;
    *{"$pkg\::process"}       = sub { goto &process };
    *{"$pkg\::process_first"} = sub { goto &process_first };
    *{"$pkg\::result"}        = sub { goto &result  };
}

callerは、callerを実行したファンクションの呼び出し元情報を返します。引数なしで呼び出すと、スカラコンテキストではパッケージ名のみ、リストコンテキストでは実行中サブルーチンの呼び出し元のパッケージ名、ファイル名、行番号を返します。

http://www.rfs.jp/sb/perl/05/caller.html

my $pkg = caller;
で呼び出し元パッケージ名を得ているわけだ。ふむふむ。

    no strict 'refs';
    *{"$pkg\::scraper"} = \&scraper;

で、型グロブを使って呼び出し元のパッケージにscraperサブルーチンを追加ってことだ。

scraperの作成
sub scraper(&) {
    my($coderef) = @_;
    bless { code => $coderef }, __PACKAGE__;
}

Web::Scraperパッケージのオブジェクトを生成する。
引数は無名サブルーチン(のリファレンス)。

サンプルコードで言うと、

   process '#btAsinTitle', 'yen' => 'TEXT';
scrape

いろいろやっているが、、、、また次の機会にでも。




[参考資料]
http://www.slideshare.net/miyagawa/web-scraper-shibuyapm-tech-talk-8
http://d.hatena.ne.jp/perlcodesample/20080715/1216137719