wgetを使用してWebサイトのコンテンツをダウンロードしていますが、wgetはファイルを1つずつダウンロードします。
4つの同時接続を使用してwgetをダウンロードするにはどうすればよいですか?
wgetを使用してWebサイトのコンテンツをダウンロードしていますが、wgetはファイルを1つずつダウンロードします。
4つの同時接続を使用してwgetをダウンロードするにはどうすればよいですか?
回答:
aria2を使用します。
aria2c -x 16 [url]
# |
# |
# |
# ----> the number of connections
大好きです !!
-s
分割数-k
を指定し、分割セグメントごとの最小サイズを指定することを忘れないでください。そうしないと、-x
最大接続数に到達しない可能性があります。
Wgetは、ファイルのダウンロードを高速化するために、複数のソケット接続をサポートしていません。
私たちは、gmarianの回答よりも少し上手にできると思います。
正しい方法はを使用することaria2
です。
aria2c -x 16 -s 16 [url]
# | |
# | |
# | |
# ---------> the number of connections here
-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
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.
aria2c -x 4 -k 1M url
、私にとってはうまく機能しています(接続ごとに100kの制限があるサーバーでは、上記のパラメーターを使用して400kでダウンロードできます)
aria2
ないではないそれのための規格外の交換作り、再帰的なHTTPダウンロードをサポートしwget
ている場合-r
が望まれています。
GNU Parallelはまだ言及されていないので、別の方法で説明しましょう。
cat url.list | parallel -j 8 wget -O {#}.html {}
cat
です。この限られた状況では、それはまったく無害ですが、このアンチパターンを実行したくないのかもしれません。
(おそらく)解決策を見つけました
あるサーバーから次のサーバーに数千のログファイルをダウンロードする過程で、突然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
「新しい」ファイルのみがダウンロードされます。つまり、サーバーでタイムスタンプが変更されない限り、ファイルが上書きまたは再ダウンロードされることはありません。
-nc
オプションを追加:「no clobber」-wgetが領域の大きいダウンロードされた(部分的にであっても)ファイルを無視します。
wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -nc
非常に醜いですが、うまくいきました。:P
-b
フラグは、bashの&
ジョブ制御ビルトインの代替として、バックグラウンドでwgetプロセスを実行します。-o <filename>
指定されていない場合、STDOUTはwget-logに書き込まれます。スクリプトに適しています。詳細については、wget(1)を参照してください。
これを実行できる別のプログラムはaxel
です。
axel -n <NUMBER_OF_CONNECTIONS> URL
基本的なHTTP認証の場合、
axel -n <NUMBER_OF_CONNECTIONS> "user:password@https://domain.tld/path/file.ext"
axel -n 4 "user:pasword@http://domain.tld/path/file.ext"
新しい(まだリリースされていない)ツールはMgetです。Wgetから既知の多くのオプションがあり、独自のアプリケーションにダウンロードを簡単に埋め込む(再帰的)ライブラリを備えています。
あなたの質問に答えるには:
mget --num-threads=4 [url]
更新
Mgetは、多くのバグが修正され、より多くの機能(HTTP / 2サポートなど)を備えたWget2として開発されました。
--num-threads
です--max-threads
。
httrackを使用することを強くお勧めします。
例: httrack -v -w http://example.com/
デフォルトでは、8つの同時接続でミラーリングを行います。Httrackには、プレイする場所がたくさんあります。見てください。
他のポスターが述べたように、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にあります。
wgetは複数の接続でダウンロードできません。代わりに、aria2のような他のプログラムを使用してみることができます。
複数のファイルで並行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-size
20mbのデフォルト値があります。このオプションを設定していない場合、20mb未満のファイルは、-x
またはの値に関係なく、単一の接続でのみ実行されます-s
make
簡単に並列化できます(例:)make -j 4
。たとえば、Makefile
wgetを使用してファイルを並行してダウンロードするために使用している簡単な例を次に示します。
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
正規表現または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 /秒の巨大なファイルをコピーすることができました。