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

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2008/04/21 14:31:29
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tobeoscontinue No.2

回答回数220ベストアンサー獲得回数59

ポイント50pt

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

で出来ました。

連続してならファイルシステムのキャッシュが効いていると思うので二回目以降は早いように思います。

id:munyaX

なるほど、curlは見落としていました。

簡単に取得できるんですねぇ~。と思ってコマンドライン叩いたら、サバに入ってませんでした(涙)

あまり好き勝手にインストールできない環境ですので、今回はwgetで行こうかな、と思います。ソースもありがとうございました。参考になります!

2008/04/18 12:00:31

その他の回答2件)

id:tmasao No.1

回答回数77ベストアンサー獲得回数20

ポイント25pt

list.txtの各行の先頭に wget を追加して

wget http://www.yahoo.co.jp/ -O 1.html

wget http://www.google.com/ -O 2.html

というようなファイルにしておいて、

コマンドで

sh list.txt

とすればよろしいのではないかと思います。

id:munyaX

うーん、やはりそれしかないのでしょうか。

wgetの起動時のオーバーヘッドが気になったので、-iオプションに期待したのですが、一度起動してしまえばメモリに上がるので2回目以降は大した負荷にはならない感じでしょうか?


負荷が大したことないなら、シェルでぐるぐる回してみたいと思います。

(取得したいURLが将来的に増える可能性があったもので(^^;)

2008/04/17 19:25:38
id:tobeoscontinue No.2

回答回数220ベストアンサー獲得回数59ここでベストアンサー

ポイント50pt

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

で出来ました。

連続してならファイルシステムのキャッシュが効いていると思うので二回目以降は早いように思います。

id:munyaX

なるほど、curlは見落としていました。

簡単に取得できるんですねぇ~。と思ってコマンドライン叩いたら、サバに入ってませんでした(涙)

あまり好き勝手にインストールできない環境ですので、今回はwgetで行こうかな、と思います。ソースもありがとうございました。参考になります!

2008/04/18 12:00:31
id:STRing No.3

回答回数351ベストアンサー獲得回数36

ポイント25pt

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);
}
id:munyaX

当初は以下のようなPerlのコードをぐるぐる回そうかと思っていたのですが、

 use LWP::Simple;

 getstore("http://www.yahoo.co.jp/", "1.html");

思ったより速度が出なかったのでやめちゃいました(^^;

wgetの利点は様々なオプションが用意されており、すでにその物があるという点で楽チンだったので採用しました。


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

ありがとうございます!

2008/04/18 16:29:46

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません