Wgetを使用した複数の同時ダウンロード?


207

wgetを使用してWebサイトのコンテンツをダウンロードしていますが、wgetはファイルを1つずつダウンロードします。

4つの同時接続を使用してwgetをダウンロードするにはどうすればよいですか?


4
良い解決策を用いた同様の質問:stackoverflow.com/questions/7577615/parallel-wget-in-bash
JohnEye

回答:


197

aria2を使用します。

aria2c -x 16 [url]
#          |
#          |
#          |
#          ----> the number of connections 

http://aria2.sourceforge.net

大好きです !!


26
これがウェブサイトのダウンロードにどのように役立つかわかりません-1つのファイルしかダウンロードしないようです。これが本当なら-投票は-veでなければなりません。
Stephen

8
aria2は、wgetやlftpのようなWebまたはFTPミラーリングを実行できないため、これは良い答えではありません。lftpは、ミラーリングと複数の接続のサポートを行います。
アナクロニスト、2014年

9
-s分割数-kを指定し、分割セグメントごとの最小サイズを指定することを忘れないでください。そうしないと、-x最大接続数に到達しない可能性があります。
ボブ

2
@Stephenこれは、1つではなく複数のソケットをサーバーに使用することにより Webサイトから非常に大きなファイルをより速くダウンロードするためのものです。これは、ウェブサイトをこするためのものではありません。
gabeio 2015

ソックスをサポートしていません*
Fedcomp

111

Wgetは、ファイルのダウンロードを高速化するために、複数のソケット接続をサポートしていません。

私たちは、gmarianの回答よりも少し上手にできると思います。

正しい方法はを使用することaria2です。

aria2c -x 16 -s 16 [url]
#          |    |
#          |    |
#          |    |
#          ---------> the number of connections here

19
文書-x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1-s, --split=N Download a file using N connections. If more than N URIs are given, first N URIs are used and remaining URLs are used for backup. If less than N URIs are given, those URLs are used more than once so that N connections total are made simultaneously. The number of connections to the same host is restricted by the --max-connection-per-server option. See also the --min-split-size option. Possible Values: 1-* Default: 5
Nick

パラメータについて詳しく説明してくれてありがとう、ニック。
thomas.han 2016

4
オプション-sだけでは、1.10リリース以降、単一のサーバーからファイルを分割しなくなりました。複数の接続を強制的に確立するには、-max-connection-per-serverを一緒に使用する必要があります。aria2のドキュメントを参照: About the number of connections Since 1.10.0 release, aria2 uses 1 connection per host by default and has 20MiB segment size restriction. So whatever value you specify using -s option, it uses 1 connection per host. To make it behave like 1.9.x, use --max-connection-per-server=4 --min-split-size=1M.
Samuel Li

1
@SamuelLiの更新の略記はaria2c -x 4 -k 1M url、私にとってはうまく機能しています(接続ごとに100kの制限があるサーバーでは、上記のパラメーターを使用して400kでダウンロードできます)
EkriirkE

批判的に、aria2ないではないそれのための規格外の交換作り、再帰的なHTTPダウンロードをサポートしwgetている場合-rが望まれています。
user2943160

54

GNU Parallelはまだ言及されていないので、別の方法で説明しましょう。

cat url.list | parallel -j 8 wget -O {#}.html {}

4
それは興味深いアプローチです。巨大なファイルをダウンロードする必要があり、接続ごとの速度が制限されている場合は、実際には適用できませんが、複数のファイルをダウンロードする場合に役立ちます。
Nikola Petkanski、2016

このコマンドを実行すると、リストが8回実行されます。私は同じようにそれを行いました、そして、8本の平行線で各線を処理する代わりに、それは単にリスト全体を8回処理します。
DomainsFeatured

4
いいえ、リストを8つのジョブに分割します
Nikolay Shmyrev

さて、私は間違いなく変なことをしています。それを理解します。迅速な対応に感謝致します。
DomainsFeatured

1
しかし、それはの役に立たない使用法catです。この限られた状況では、それはまったく無害ですが、このアンチパターンを実行したくないのかもしれません。
tripleee 2017

39

(おそらく)解決策を見つけました

あるサーバーから次のサーバーに数千のログファイルをダウンロードする過程で、突然BSDで深刻なマルチスレッドダウンロードを行う必要がありました。これは、Wgetを使用して、これを処理するのに最も簡単な方法だと思いました。少し見回すと、この小さなナゲットに私を導きました:

wget -r -np -N [url] &
wget -r -np -N [url] &
wget -r -np -N [url] &
wget -r -np -N [url]

wget -r -np -N [url]必要な数だけスレッドを繰り返してください...これはかなり良くないので、これを行うには確かにもっと良い方法がありますが、何か速くて汚いことが必要な場合はそれでうまくいきます...

注:このオプションを選択-Nすると、wget「新しい」ファイルのみがダウンロードされます。つまり、サーバーでタイムスタンプが変更されない限り、ファイルが上書きまたは再ダウンロードされることはありません。


11
しかし、それは各プロセスのアーティファクトのセット全体をダウンロードしませんか?
Kai Mattern 14

10
@KaiMattern:-ncオプションを追加:「no clobber」-wgetが領域の大きいダウンロードされた(部分的にであっても)ファイルを無視します。
SF。

1
ダウンロードする必要がある画像のリストがあり、これも私にとってはうまくいきました。wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -nc非常に醜いですが、うまくいきました。:P
Jared

1
何らかの理由でこれらの接続の1つが切断されると、他の接続に影響されることなく、未完了のファイルが得られます。この方法では整合性の問題が発生します。
muhammedv 2017年

この-bフラグは、bashの&ジョブ制御ビルトインの代替として、バックグラウンドでwgetプロセスを実行します。-o <filename>指定されていない場合、STDOUTはwget-logに書き込まれます。スクリプトに適しています。詳細については、wget(1)を参照してください。
ポール

21

これを実行できる別のプログラムはaxelです。

axel -n <NUMBER_OF_CONNECTIONS> URL

基本的なHTTP認証の場合、

axel -n <NUMBER_OF_CONNECTIONS> "user:password@https://domain.tld/path/file.ext"

Ubuntuのmanページ


5
このプログラムは、無制限の数の接続を許可します。これは、場合によっては非常に便利です。
uglide 2015

1
素晴らしいツール。centos6.xiの場合、rpm.pbone.net
index.php3

AxelはHTTP基本認証を実行できません:(
rustyx

1
私は通常行うaxel -n 4 "user:pasword@http://domain.tld/path/file.ext"
主楼を。

フォルダー全体を再帰的にダウンロードするためにaxelを使用できますか?
Ryan Arief

17

新しい(まだリリースされていない)ツールはMgetです。Wgetから既知の多くのオプションがあり、独自のアプリケーションにダウンロードを簡単に埋め込む(再帰的)ライブラリを備えています。

あなたの質問に答えるには:

mget --num-threads=4 [url]

更新

Mgetは、多くのバグが修正され、より多くの機能(HTTP / 2サポートなど)を備えたWget2として開発されました

--num-threadsです--max-threads


いい発見。ありがとうございました!
user9869932

Macにwget2をインストールする方法に関するヒントはありますか?サイトは、ソースからインストールする方法と自動ポイントの取得に問題があることのみを文書化しています
Chris

TravisCIスクリプトでは、homebrewを使用してgettext(autopointを含む)をインストールします。wget2リポジトリの.travis_setup.shをご覧ください。
rockdaboot

13

httrackを使用することを強くお勧めします。

例: httrack -v -w http://example.com/

デフォルトでは、8つの同時接続でミラーリングを行います。Httrackには、プレイする場所がたくさんあります。見てください。


@ aaa90210:プログラムの不備について簡潔に説明していただければ幸いです。ArturBoderaのコメントはより有益です。
リチャード

@ArturBoderaプログラムを実行しているフォルダーにcookies.txtファイルを追加すると、それらのCookieがダウンロードヘッダーに自動的に追加されます。
Bertoncelj1

httrackは次のリダイレクトをサポートしていません
Chris Hunt

11

他のポスターが述べたように、aria2をご覧になることをお勧めします。バージョン1.16.1のUbuntu manページから:

aria2はファイルをダウンロードするためのユーティリティです。サポートされるプロトコルは、HTTP(S)、FTP、BitTorrent、Metalinkです。aria2は、複数のソース/プロトコルからファイルをダウンロードでき、最大ダウンロード帯域幅を利用しようとします。HTTP(S)/ FTPおよびBitTorrentからのファイルのダウンロードを同時にサポートし、HTTP(S)/ FTPからダウンロードされたデータはBitTorrentスウォームにアップロードされます。Metalinkのチャンクチェックサムを使用して、aria2は、BitTorrentのようなファイルをダウンロードするときに、データのチャンクを自動的に検証します。

-xフラグを使用して、サーバーごとの最大接続数を指定できます(デフォルト:1)。

aria2c -x 16 [url] 

同じファイルを複数の場所から入手できる場合は、それらすべてからダウンロードすることを選択できます。-jフラグを使用して、すべての静的URIの並列ダウンロードの最大数を指定します(デフォルト:5)。

aria2c -j 5 [url] [url2]

詳細については、http://aria2.sourceforge.net/を参照してください。使用方法については、manページが説明的で、下部に使用例のセクションがあります。オンラインバージョンはhttp://aria2.sourceforge.net/manual/en/html/README.htmlにあります。


8

wgetは複数の接続でダウンロードできません。代わりに、aria2のような他のプログラムを使用してみることができます。



4

使用する

aria2c -x 10 -i websites.txt >/dev/null 2>/dev/null &

websites.txtに、1行に1つのURLを入力します。例:

https://www.example.com/1.mp4
https://www.example.com/2.mp4
https://www.example.com/3.mp4
https://www.example.com/4.mp4
https://www.example.com/5.mp4

2

彼らは常にそれが依存していると言いますが、それがウェブサイトをミラーリングすることになると、最高のhttrackが存在します。超高速で作業が簡単です。唯一の欠点は、いわゆるサポートフォーラムですが、公式のドキュメントを使用して方法を見つけることができます。GUIとCLIの両方のインターフェイスがあり、Cookieをサポートしています。ドキュメントを読むだけですこれは最高です(このツールを使用すると、ハードドライブにWeb全体をダウンロードできます)。

httrack -c8 [url]

デフォルトでは、サーバーの過負荷を回避するために、同時接続の最大数は8制限されています


2

複数のファイルで並行xargsしてwget作業するために使用します

#!/bin/bash

mywget()
{
    wget "$1"
}

export -f mywget

# run wget in parallel using 8 thread/connection
xargs -P 8 -n 1 -I {} bash -c "mywget '{}'" < list_urls.txt

Aria2オプション、20MB未満のファイルを扱う正しい方法

aria2c -k 2M -x 10 -s 10 [url]

-k 2M ファイルを2MBのチャンクに分割

-kまたは--min-split-size20mbのデフォルト値があります。このオプションを設定していない場合、20mb未満のファイルは、-xまたはの値に関係なく、単一の接続でのみ実行されます-s


1

make簡単に並列化できます(例:)make -j 4。たとえば、Makefilewgetを使用してファイルを並行してダウンロードするために使用している簡単な例を次に示します。

BASE=http://www.somewhere.com/path/to
FILES=$(shell awk '{printf "%s.ext\n", $$1}' filelist.txt)
LOG=download.log

all: $(FILES)
    echo $(FILES)

%.ext:
    wget -N -a $(LOG) $(BASE)/$@

.PHONY: all
default: all

0

正規表現またはFTP Globbingの使用を検討してください。これにより、発生頻度に応じて、ファイル名の開始文字の異なるグループでwgetを複数回開始できます。

これは、たとえば、2つのNAS間でフォルダを同期する方法です。

wget --recursive --level 0 --no-host-directories --cut-dirs=2 --no-verbose --timestamping --backups=0 --bind-address=10.0.0.10 --user=<ftp_user> --password=<ftp_password> "ftp://10.0.0.100/foo/bar/[0-9a-hA-H]*" --directory-prefix=/volume1/foo &
wget --recursive --level 0 --no-host-directories --cut-dirs=2 --no-verbose --timestamping --backups=0 --bind-address=10.0.0.11 --user=<ftp_user> --password=<ftp_password> "ftp://10.0.0.100/foo/bar/[!0-9a-hA-H]*" --directory-prefix=/volume1/foo &

最初のwget 0, 1, 2... F, G, Hは次で始まるすべてのファイル/フォルダーを同期し、2番目のスレッドはその他すべてを同期します。

これは、1つの10Gイーサネットポート(10.0.0.100)を持つNASと2つの1Gイーサネットポート(10.0.0.10および10.0.0.11)を持つNASの間で同期する最も簡単な方法でした。2つのwgetスレッドを--bind-address別のイーサネットポートにバインドし、&各行の終わりに配置して並列に呼び出しました。それにより、2x 100 MB /秒=合計200 MB /秒の巨大なファイルをコピーすることができました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.