2009年3月19日木曜日

Webページの画像を保存するPerlスクリプト

Webページにある画像を保存するスクリプトを書いてみました。

#!/usr/bin/perl

use LWP::UserAgent;
use HTML::DOM;
use Digest::MD5 qw(md5_hex);
use Path::Class qw(file);

my $ua = LWP::UserAgent->new;
my $referer = "http://example.com/";
my $url = "http://example.com/";

my $req = new HTTP::Request('GET', $url);
my $res = $ua->request($req);

my $dom_tree = new HTML::DOM;
$dom_tree->write($res->content);
@img = $dom_tree->getElementsByTagName("img");
my $ua2 = LWP::UserAgent->new;
foreach (@img) {
my $filename = Digest::MD5::md5_hex($_->src);
my $filepath = file('./temp', $filename);
unless(-f $filepath->stringify . ".jpg" ) {
$ua2->get( $_->src, ":content_file" => $filepath->stringify . ".jpg", "referer" => $referer);
}
}


LWP::UserAgent は HTTPのリクエストやレスポンスを行うためのモジュールです。
Webページを取得して、それをDOMツリーにして、img要素のsrc属性に記述してある画像ファイルを保存するスクリプトです。

ちょっとはまったのが、はじめに HTML::DOM ではなく、XML::DOM をつかってしまったこと。

もちろん閉じタグがない要素があるので、パースエラーになってしまうのですが、エラーになかなか気づきませんでした。(ちゃんとエラーメッセージ見ろ!って思うけど)

後は、referer を設定しないと アクセスが拒否されるかもしれません。

0 件のコメント: