Table of Contents

概要

  • 1行に1つ URL が書かれたファイルにしたがって該当ファイルをダウンロードする。
  • リストファイルがあるフォルダにダウンロードしたファイルを保存する。
  • アクセス結果を表示するよう変更。(2016-09-12)

ソース

  • ListDownloader.zip
    use strict;
    use warnings;
    use utf8;
    use Encode;
    use File::Basename;
    use File::chdir;
    use LWP::UserAgent;
    use HTTP::Request;
    
    my $charsetConsole = $^O eq 'MSWin32' ? 'CP932' : 'UTF-8';
    
    binmode( STDIN,  ":encoding($charsetConsole)" );
    binmode( STDOUT, ":encoding($charsetConsole)" );
    binmode( STDERR, ":encoding($charsetConsole)" );
    
    @ARGV = map { decode( $charsetConsole, $_ ); } @ARGV;
    
    my $charsetFile = 'UTF-8';
    my $ioLayer     = $^O eq 'MSWin32' ? "raw:encoding($charsetFile):crlf" : "encoding($charsetFile)";
    my $listFile    = $ARGV[0] or die("usage: ListDownloader <list file>\n");
    $CWD = dirname( encode( $charsetConsole, $listFile ) );
    open( my $fin, "<:$ioLayer", encode( $charsetConsole, $listFile ) )
        or die("$listFile: $!\n");
    my @lines = <$fin>;
    close($fin);
    chomp(@lines);
    my %listHash = map { $_ => 1 } @lines;
    my @list = sort( keys(%listHash) );
    
    my $ua = LWP::UserAgent->new( keep_alive => 4 );
    $ua->cookie_jar( {} );
    
    my $count = 0;
    my $max   = scalar(@list);
    foreach my $url (@list) {
        ++$count;
        $url =~ m{([^\/]+)$};
        my $filename = $1;
        print "$count/$max\t$filename\n";
        my $res
            = $ua->request( HTTP::Request->new( GET => $url ), encode( $charsetConsole, $filename ) );
        sleep(1);
    }

リンク