Translate

2009年7月1日水曜日

SPIDERING HACKS(#18)

#18は、スクリプトにプログレスバーを追加してみよう♪
ってお話ね。
原理は、LWP::UserAgentのオブジェクトを作ったのちに
getやらpostする時に、:content_cbヘッダに関数を指定することで
ある一定サイズのダウンロードが行われるたびに上記:content_cbに
指定した関数が呼び出されるを利用して、ダウンロードの進捗を表す
プログレスバーを作ろうってこった。

ちなみに、一定サイズのダウンロードごとに関数が呼び出されるわけだが
:content_cbヘッダと共に:read_size_hintというヘッダに、どのくらいの
ダウンロードサイズごとに関数を呼び出すか参考までに指定することが
できるそうな。
(指定したから、必ずそのサイズごとに呼ばれるわけではないらしい)


もっとも原始的な物はこんな感じになる。
#!/usr/bin/perl#!
use strict;
use warnings;
use LWP;
$|++;

die "[error]URLを指定して下さい。\n" unless @ARGV;
my $final_data; #受信データを格納する変数
for my $url (@ARGV){
$final_data = '';
print "URL", substr($url, 0, 40), "のダウンロード中...";
my $ua = LWP::UserAgent->new();
my $res = $ua->get($url, ':content_cb'=>\&callback);
print "\n";
}

sub callback{
my ($data, $response, $protocol) = @_;
$final_data .= $data;
print ".";
}


ポイントは、
5行目で特殊変数$|に0以外の数値を指定してバッファリングしないようにしている点
13行目で:content_cbをセットしている点かな。

他の物については、後でおいおい追加してメモ書きしておくかな。。

0 件のコメント: