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