以下のように実行しているのですが、期待通りに動作してくれません。
$ cat list.txt
http://www.yahoo.co.jp/ -O 1.html
http://www.google.com/ -O 2.html
$ wget -i list.txt
一行丸ごと(オプション込み)で一つのURLだと解釈されます。
各URL毎にwgetで取得したファイルのファイル名を指定したいのですが、どのように指定すればよいでしょうか?wget以外の代替案でもかまいませんが、あまり手間のかからない方法でお願いします。
環境は以下です。
・Debian GNU/Linux 4.0
・GNU Wget 1.10.2
curlなら
url = "http://www.yahoo.co.jp/" output = "1.html" url = "http://www.google.com/" output= "2.html"
のような形式で
curl -K list.txt
とすることで入手できました。
シェルでぐるぐる回わすなら
while read arg ; do wget $arg; done < list.txt
で出来ました。
連続してならファイルシステムのキャッシュが効いていると思うので二回目以降は早いように思います。
list.txtの各行の先頭に wget を追加して
wget http://www.yahoo.co.jp/ -O 1.html
wget http://www.google.com/ -O 2.html
というようなファイルにしておいて、
コマンドで
sh list.txt
とすればよろしいのではないかと思います。
うーん、やはりそれしかないのでしょうか。
wgetの起動時のオーバーヘッドが気になったので、-iオプションに期待したのですが、一度起動してしまえばメモリに上がるので2回目以降は大した負荷にはならない感じでしょうか?
負荷が大したことないなら、シェルでぐるぐる回してみたいと思います。
(取得したいURLが将来的に増える可能性があったもので(^^;)
curlなら
url = "http://www.yahoo.co.jp/" output = "1.html" url = "http://www.google.com/" output= "2.html"
のような形式で
curl -K list.txt
とすることで入手できました。
シェルでぐるぐる回わすなら
while read arg ; do wget $arg; done < list.txt
で出来ました。
連続してならファイルシステムのキャッシュが効いていると思うので二回目以降は早いように思います。
なるほど、curlは見落としていました。
簡単に取得できるんですねぇ~。と思ってコマンドライン叩いたら、サバに入ってませんでした(涙)
あまり好き勝手にインストールできない環境ですので、今回はwgetで行こうかな、と思います。ソースもありがとうございました。参考になります!
上記のスクリプトを少し弄って perl でやるのはどうでしょうか?
@addr に URL 、 @file にファイル名を対応するように書くというかなり適当なコードですが……
use strict; use Socket; use FileHandle; my ($proxy_host, $proxy_port, $http); my ($arg, $buf); # HTTPプロトコルのバージョン #$http = '1.1'; # プロキシサーバの設定 #$proxy_host = 'XXX.XXX.XXX.XXX'; #$proxy_port = 8080; my @addr = ("http://www.hatena.ne.jp/", "http://q.hatena.ne.jp/"); my @file = ("www_hatena.html", "q_hatena.html"); my $i = 0; until ($i > $#addr) { &http($addr[$i], $file[$i]); $i++; } # $_[0] = URL # $_[1] = Name to save sub http { my ($con_host, $con_port); my ($host, $port, $url, $path, $ip, $sockaddr); # デフォルトホストの設定 $host = 'localhost'; $port = getservbyname('http', 'tcp'); $path = '/'; # URL解析処理 $_[0] =~ m!(http:)?(//)?([^:/]*)?(:([0-9]+)?)?(/.*)?!; if ($3) {$host = $3;} if ($5) {$port = $5;} if ($6) {$path = $6;} #print "host=$host, port=$port, url=$url\n"; if ($proxy_host) { # プロキシサーバ経由 $con_host = $proxy_host; $con_port = $proxy_port; $url = $arg; } else { $con_host = $host; $con_port = $port; $url = $path; } # 保存ファイルのオープン open(FILE, "> " . $_[1]); # ソケットの生成 $ip = inet_aton($con_host) || die "host($con_host) not found.\n"; $sockaddr = pack_sockaddr_in($con_port, $ip); socket(SOCKET, PF_INET, SOCK_STREAM, 0) || die "socket error.\n"; # ソケットの接続 connect(SOCKET, $sockaddr) || die "connect $con_host $con_port error.\n"; autoflush SOCKET (1); # HTTP要求を送信 if ($http eq '1.1') { print SOCKET "GET $url HTTP/1.1\n"; print SOCKET "Host: $host\n"; print SOCKET "Connection: close\n\n"; } else { print SOCKET "GET $url HTTP/1.0\n\n"; } # HTTP応答を受信 while (chomp($buf=<SOCKET>)) { print(FILE "$buf\n"); } # 終了処理 close(SOCKET); close(FILE); }
当初は以下のようなPerlのコードをぐるぐる回そうかと思っていたのですが、
use LWP::Simple;
getstore("http://www.yahoo.co.jp/", "1.html");
思ったより速度が出なかったのでやめちゃいました(^^;
wgetの利点は様々なオプションが用意されており、すでにその物があるという点で楽チンだったので採用しました。
なるべく楽チンな方法がよいですねぇ。
ありがとうございます!
なるほど、curlは見落としていました。
簡単に取得できるんですねぇ~。と思ってコマンドライン叩いたら、サバに入ってませんでした(涙)
あまり好き勝手にインストールできない環境ですので、今回はwgetで行こうかな、と思います。ソースもありがとうございました。参考になります!