メメメモモ

プログラミング、筋トレ、ゲーム、etc

ダウンロードスクリプトにプログレスバーを付ける

ダウンロード中に、残りいくつかを表示するプログレスバー

use strict;
use warnings;
use Term::ProgressBar;
use LWP::UserAgent;

$| = 1;
my @urls = @ARGV;

my $data;
my $total_size;
my $progress;
my $next_update = 0;

for my $url (@urls) {
    $data = '';
    print " downloading " , substr($url, 0, 40), "\n";

    my $ua = LWP::UserAgent->new();
    my $result = $ua->head($url);
    my $remote_headers = $result->headers;
    $total_size = $remote_headers->content_length;

    $progress =
        Term::ProgressBar->new({count => $total_size, ETA => 'linear'});
    $progress->minor(0);
    $progress->max_update_rate(1);

    my $response = $ua->get($url, ":content_cb" => \&callback, );

    $progress->update($total_size);
    print length $data, "\n";
}


sub callback {
    my ($d, $response, $protocol) = @_;
    $data .= $d;

    $next_update = $progress->update(length($data))
        if length($data) >= $next_update;
}


ダウンロードは「LWP::UserAgent」モジュールを、
プログレスバー表示には「Term::ProgressBar」モジュールを用いています。


まず、「$ua->head($url)」でヘッダを取得し、Content-Lengthを取得して、Term::ProgressBarモジュールにセットしています。
これにより、何%までダウンンロードできたかを表示できるようになります。


次に、ダウンロードの途中に呼び出される関数を定義し、LWP::UserAgentのget()メソッドで渡します。

my $response = $ua->get($url, ":content_cb" => \%callback);


callback()関数の中で、プログレスバーの更新を行なう処理が記述されています。


上記のような手順で、wgetのようなプログレスバーが表示されるようになりました。

参考

Spidering hacks―ウェブ情報ラクラク取得テクニック101選

Spidering hacks―ウェブ情報ラクラク取得テクニック101選