Web::Scraperに入門した

2009年2月28日
| コメント(0) | トラックバック(0) Web::Scraperに入門した

かなーり今更感がありますが。
モジュール自体は、大分前にウェブにあったスクリプトをコピペして使ったときにインストール済みでしたが、なんとなく難しそうで敬遠していたところもありました。
が、やってみると簡単かつパワフルなモジュールであることがわかりました。

参考:use Web::Scraper; - 今日のCPANモジュール

XPathがなかなかわからないのですが、CSSセレクタでもいけるのが超絶簡単です。
例えば、aタグのhref属性を取得する場合のprocessは以下のとおり。

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

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

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

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

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


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

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

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で取得する時に、正規表現で必要なリンクだけ取得できればいいんですが。
やり方はありそうなんですよね…。

トラックバック(0)

このブログ記事に対するトラックバックURL:

コメントする

Google検索

Last.fm

このブログ記事について

このページは、のぶりんが2009年2月28日 02:45に書いたブログ記事です。

ひとつ前のブログ記事は「Atomのパース速度の比較」です。

次のブログ記事は「Web::Scraperで正規表現を使って必要なリンクだけを取得する方法」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログのライセンスは クリエイティブ・コモンズライセンス.
Powered by Movable Type