Web::Queryで遊んでみた

http://d.hatena.ne.jp/tokuhirom/20110221/1298244438


id:tokuhirom氏の Web::Queryを使って遊んでみた。
とりあえず DMM.co.jpの動画ダウンロード販売の人気 AV女優トップ 20を取得してみた。

コード

こんな感じです。

#!/usr/bin/env perl
use strict;
use warnings;

use utf8;
use Web::Query;

binmode STDOUT, ":utf8";

my $url = 'http://www.dmm.co.jp/'
    . 'digital/videoa/-/ranking_all/=/type=actress/ch_navi=actress/';

wq($url)
    ->find('td.bd-b > a > img')
    ->each(sub {
           my ($i, $elem) = @_;
           printf "%d位 %s\n", $i+1, $elem->attr('alt');
    });

簡潔に書けますね。私は jQueryというか JavaScript自体全然使わないの
ですが、Web::Scraperに比べるとだいぶシンプルなんじゃないかなと
思いました。


ちなみに結果は以下のような感じです。

1位 つぼみ
2位 麻美ゆま
3位 大沢美加(廣田まりこ)
4位 晶エリー(大沢佑香)
5位 成瀬心美(ここみ)
6位 吉沢明歩
7位 ほしのあすか
8位 佐山愛
9位 Rio(柚木ティナ)
10位 蒼井そら
11位 水城奈緒
12位 雪見紗弥
13位 堀口奈津美(恩田ほのか)
14位 小川あさ美
15位 管野しずか
16位 佳山三花
17位 希志あいの
18位 藤浦めぐ
19位 仁科百華
20位 初音みのり

Web::Scraperの場合

比較のために書いてみました。オーソドックな書き方にしています。
出力結果は同じになります。

#!/usr/bin/env perl
use strict;
use warnings;

use utf8;
use URI;
use Web::Scraper;

binmode STDOUT, ":utf8";

my $url = 'http://www.dmm.co.jp/'
    . 'digital/videoa/-/ranking_all/=/type=actress/ch_navi=actress/';

my $actress_ranking = scraper {
    process 'td.bd-b', 'actresses[]' => scraper {
        process 'a > img', 'name' => '@alt';
    };
};

my $res = $actress_ranking->scrape(URI->new($url));

my $i = 1;
for my $actress (@{$res->{actresses}}) {
    printf "%d位 %s\n", $i++, $actress->{name};
}

まとめ

Web::Queryで遊んでみました。処理が一つのところにまとまる感じが
いいかなと思いました。コールバック関数がすごく長くなって
しまうとどうかわからないですけど、数十行なら問題ないのではない
でしょうか。jQueryを全然知らないので、なんとも言えないですが、
普段慣れてるのであれば、さらっと書けてしまうんじゃないでしょうかね。


まだリリースされたばっかりで、仕様も変わるかもしれないですが、
今後が楽しみなモジュールだと思います。