Web::Scraperに入門した

かなーり今更感がありますが。 モジュール自体は、大分前にウェブにあったスクリプトをコピペして使ったときにインストール済みでしたが、なんとなく難しそうで敬遠していたところもありました。 が、やってみると簡単かつパワフルなモジュールであることがわかりました。 参考:use Web::Scraper; - 今日のCPANモジュール XPathがなかなかわからないのですが、CSSセレクタでもいけるのが超絶簡単です。 例えば、aタグのhref属性を取得する場合のprocessは以下のとおり。

1
process 'a', 'urls[]' => '@href';

で、この場合だと、href属性がないaタグも対象になってしまうので、未定義(undef)が入る場合があります。 なので、href属性があるものだけを対象としたのが以下のprocessです。

1
process 'a[href]', 'urls[]' => '@href';

同じものをXPathで書くと以下のとおり。

1
process '//a[@href]', 'urls[]' => '@href';

で、リンクをたどる場合は画像を取得するのが基本(?)なので、そういうスクリプトを書いてみました。 …何番煎じかわかりませんが。

ソースコード。 このスクリプトを使う場合は、画像の保存用に、スクリプトと同じディレクトリに「images」というディレクトリをあらかじめ用意する必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
use strict;
use warnings;
use Web::Scraper;
use URI ();
use LWP::Simple qw(mirror);
use File::Basename qw(basename);
my $uri     = URI->new("http://weblog.nqou.net");
my $scraper = scraper {
    process 'a[href]', 'urls[]' => '@href';
    result 'urls';
};
my $result = $scraper->scrape($uri);
foreach my $link (@{$result}) {
    if ($link =~ /\.jpe?g$/) {
        my $filename = basename($link);
        mirror($link, './images/' . $filename);
        sleep 1;
    }
}

理想を言えば、scraperで取得する時に、正規表現で必要なリンクだけ取得できればいいんですが。 やり方はありそうなんですよね…。

Comments

comments powered by Disqus