調子に乗って、指定ウェブアドレスのページを自動的にダウンロードの応用として、指定のページにあるすべての画像を自動的にダウンロードするプログラムを書いて見ました。
パラメータはファイル名で、内容は一行に一URLです。
この例では、jpgしか見ていませんが、pngやgifなどほしいフォーマットを追加すれば良いです。画像に限らず、PDFやDOCなどもっと広げることもできます。
個々の課題については、調べるとくどい説明と分かりにくい例が一杯あり、読むだけで疲れてしまいます。よって、ここでは、タスクベース、つまり目的に応じた、独立したプログラムをまとめてみることにしました。へたくそとか、効率悪いとか言う見方もあるかもしれませんが、一応そこそこ快適に動くことは確認しました。結果オーライ!
個々の課題の例としては、「URL文字列からファイル名だけを取り出す」や、行末の改行コードを除去する」、「ハッシュの配列の参照」、「ファイルの入出力」等等です。
しかし、HTMLとかLWP、Fileなどのクラスってすばらしいものですね。すべて自作していたら日が暮れます。
use strict;
use HTML::LinkExtor;
use LWP::Simple;
use File::Basename;
my $file=$ARGV[0];
my $tag;
open(IN, "$file") or die"$!";
sub getFileName{
my $path = shift;
my ($name, $path, $suffix) = fileparse($path, ());
return ( $name );
}
my $out;
my $line;
while(<IN>) {
$line = $_;
$line =~ s/\n//;
my $parser = HTML::LinkExtor->new(undef, $line);
$parser->parse(get($line))->eof;
@links = $parser->links;
foreach $linkarray (@links) {
my ($elt_type, %attrs) = @$linkarray;
if (($elt_type eq 'img' || $elt_type eq 'IMG') && $attrs{'src'} =~ /\.jpg$/i) {
$out = getFileName($attrs{'src'});
getstore($attrs{'src'}, $out);
}
}
}