我使用wget下载网站内容,但是wget是一个一个下载文件的。
我怎么能让wget下载使用4个同时连接?
Wget不能在多个连接中下载,相反,您可以尝试使用其他程序,如aria2。
我发现(可能) 一个解决方案 < / p >
在从一个服务器下载几千个日志文件的过程中 到下一个我突然有必要做一些严肃的多线程 在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]… 考虑到这并不漂亮,肯定有更好的方法 但是如果你想要一些快速和肮脏的东西,它应该可以做到…
在从一个服务器下载几千个日志文件的过程中 到下一个我突然有必要做一些严肃的多线程 在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只下载“更新的”文件,这意味着它不会覆盖或重新下载文件,除非它们在服务器上的时间戳发生了变化。
-N
wget
尝试pcurl
http://sourceforge.net/projects/pcurl/
使用curl代替wget,并行下载10段。
使用咏叹调2:
aria2c -x 16 [url] # | # | # | # ----> the number of connections
http://aria2.sourceforge.net
我强烈建议使用httrack。
例:httrack -v -w http://example.com/
httrack -v -w http://example.com/
默认情况下,它将使用8个同时连接创建镜像。Httrack有很多游戏地点可供选择。看一看。
正如其他海报所提到的,我建议你看看aria2。Ubuntu 1.16.1版本的手册页:
Aria2是一个用于下载文件的实用程序。支持的协议有HTTP(S)、FTP、BitTorrent和Metalink。Aria2可以从多个源/协议下载文件,并尝试利用您的最大下载带宽。它支持同时从HTTP(S)/FTP和BitTorrent下载文件,而从HTTP(S)/FTP下载的数据上传到BitTorrent群。使用Metalink的块校验和,aria2在下载BitTorrent等文件时自动验证数据块。
你可以使用-x标志来指定每台服务器的最大连接数(默认为1):
-x
aria2c -x 16 [url]
如果同一文件可从多个位置下载,则可以选择从所有位置下载。使用-j标志为每个静态URI指定并行下载的最大数量(默认为5)。
-j
aria2c -j 5 [url] [url2]
更多信息请看http://aria2.sourceforge.net/。对于使用信息,手册页是真正的描述性的,并在底部有一个小节提供了使用示例。在线版本可以在http://aria2.sourceforge.net/manual/en/html/README.html找到。
回答你的问题:
mget --num-threads=4 [url]
更新
Mget现在开发为Wget2,修复了许多错误和更多的功能(例如HTTP/2支持)。
--num-threads现在是--max-threads。
--num-threads
--max-threads
为了加快文件下载速度,Wget不支持多个套接字连接。
我想我们可以给出比格里安更好的答案。
正确的方法是使用aria2。
aria2
aria2c -x 16 -s 16 [url] # | | # | | # | | # ---------> the number of connections here
官方文档:
-x, --max-connection-per-server=NUM:每次下载到一台服务器的最大连接数。取值范围:1-16默认值:1
-x, --max-connection-per-server=NUM
1-16
1
-s, --split=N:使用N个连接下载文件。如果提供了超过N个uri,则使用前N个uri,其余url用于备份。如果给出的uri少于N个,则这些url将被使用不止一次,以便同时建立总共N个连接。到同一主机的连接数量由--max-connection-per-server选项限制。另见--min-split-size选项。取值范围:1-*默认值:5
-s, --split=N
--max-connection-per-server
--min-split-size
1-*
5
另一个可以做到这一点的程序是axel。
axel
axel -n <NUMBER_OF_CONNECTIONS> URL
对于基本的HTTP认证,
axel -n <NUMBER_OF_CONNECTIONS> "user:password@https://domain.tld/path/file.ext"
Ubuntu手册。
由于还没有提到GNU并行,让我给出另一种方式:
cat url.list | parallel -j 8 wget -O {#}.html {}
make可以很容易地并行化(例如,make -j 4)。例如,这是一个简单的Makefile,我使用wget并行下载文件:
make
make -j 4
Makefile
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
他们总是说这要视情况而定,但当涉及到镜像网站时,最好的存在httrack。这是超级快速和容易工作。唯一的缺点是它是所谓的支持论坛,但你可以使用官方文档找到你的方法。它有GUI和CLI界面,它支持cookie,只是阅读文档,这是最好的。(用这个工具你可以在你的硬盘上下载整个网络)
httrack -c8 [url]
默认最大同时连接数限量8个,以避免服务器过载
使用xargs使wget在多个文件中并行工作
xargs
#!/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 2M
-k或--min-split-size的默认值是20mb,如果你不设置这个选项并且文件小于20mb,不管-x或-s的值是多少,它都只会在单个连接中运行
-k
-s
使用
aria2c -x 10 -i websites.txt >/dev/null 2>/dev/null &
在sites.txt中每行放一个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
考虑使用正则表达式或FTP Globbing。通过这种方法,您可以使用不同的文件名起始字符组多次启动wget,这取决于它们出现的频率。
这是我如何在两个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开头的所有文件/文件夹,第二个线程同步其他所有文件/文件夹。
0, 1, 2... F, G, H
这是在带有一个10G以太网端口(10.0.0.100)的NAS和带有两个1G以太网端口(10.0.0.10和10.0.0.11)的NAS之间进行同步的最简单方法。我通过--bind-address将两个wget线程绑定到不同的以太网端口,并通过在每行的末尾放置&将它们称为并行。通过这种方式,我能够复制2x 100mb /s = 200 MB/s的大文件。
--bind-address
&
为每个链接调用Wget并将其设置为在后台运行。
我尝试了这段Python代码
with open('links.txt', 'r')as f1: # Opens links.txt file with read mode list_1 = f1.read().splitlines() # Get every line in links.txt for i in list_1: # Iteration over each link !wget "$i" -bq # Call wget with background mode
参数:
b - Run in Background q - Quiet mode (No Output)
你可以使用xargs
-P是进程的数量,例如,如果设置为-P 4,将同时下载四个链接,如果设置为-P 0, xargs将启动尽可能多的进程,所有的链接将被下载。
-P
-P 4
-P 0
cat links.txt | xargs -P 4 -I{} wget {}
我正在使用gnu平行
cat listoflinks.txt | parallel --bar -j ${MAX_PARALLEL:-$(nproc)} wget -nv {}
cat
--bar
MAX_PARALLEL
提示:使用--dry-run来查看如果你执行命令会发生什么。< br > cat listoflinks.txt | parallel --dry-run --bar -j ${MAX_PARALLEL} wget -nv {} < / p >
--dry-run
cat listoflinks.txt | parallel --dry-run --bar -j ${MAX_PARALLEL} wget -nv {}
如果你正在做递归下载,你还不知道所有的url, wget是完美的。
如果您已经有了想要下载的每个URL的列表,那么可以跳过下面的cURL。
# Multiple simultaneous donwloads URL=ftp://ftp.example.com for i in {1..10}; do wget --no-clobber --recursive "${URL}" & done
上面的循环将开始10个wget,每个都递归地从同一个网站下载,但是它们不会重叠或下载同一文件两次。
使用--no-clobber可以防止10个wget进程中的每个进程下载同一文件两次(包括完整的相对URL路径)。
--no-clobber
&将每个wget fork到后台,允许你使用wget从同一个网站同时运行多个下载。
如果你已经有一个你想要下载的url列表,curl -Z是并行的curl,默认一次运行50个下载。
curl -Z
然而,对于curl,列表必须是这样的格式:
curl
url = https://example.com/1.html -O url = https://example.com/2.html -O
因此,如果您已经有一个要下载的url列表,只需格式化该列表,然后运行cURL
cat url_list.txt #https://example.com/1.html #https://example.com/2.html touch url_list_formatted.txt while read -r URL; do echo "url = ${URL}" >> url_list_formatted.txt echo "-O" >> url_list_formatted.txt done < url_list.txt
使用curl从url列表中并行下载:
curl -Z --parallel-max 100 -K url_list_formatted.txt
例如,
$ curl -Z --parallel-max 100 -K url_list_formatted.txt DL% UL% Dled Uled Xfers Live Qd Total Current Left Speed 100 -- 2512 0 2 0 0 0:00:01 0:00:01 --:--:-- 1973 $ ls 1.html 2.html url_list_formatted.txt url_list.txt