人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Wgetについて質問です。
以下のように実行しているのですが、期待通りに動作してくれません。

$ 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

●質問者: munyaX
●カテゴリ:インターネット ウェブ制作
✍キーワード:Debian GNU/Linux GNU HTML txt URL
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● tmasao
●25ポイント

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が将来的に増える可能性があったもので(^^;)


2 ● tobeoscontinue
●50ポイント ベストアンサー

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で行こうかな、と思います。ソースもありがとうございました。参考になります!


3 ● STRing
●25ポイント

Perlでブラウズ(HTTP)

上記のスクリプトを少し弄って 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の利点は様々なオプションが用意されており、すでにその物があるという点で楽チンだったので採用しました。


なるべく楽チンな方法がよいですねぇ。

ありがとうございます!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ