使用Wget同时下载多个文件?


Answers:


197

使用aria2:

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

http://aria2.sourceforge.net

我喜欢它 !!


26
我看不出这对下载网站有什么帮助-看起来它只能下载1个文件。如果是这样,则投票应为-ve。
斯蒂芬

8
我同意,这不是一个好答案,因为aria2无法像wget或lftp一样执行Web或ftp镜像。lftp可以镜像并支持多个连接。
年代学家

9
不要忘记-s指定拆分数量,并-k指定每个拆分段的最小大小-否则您可能永远无法达到-x最大连接数。
鲍勃

2
@Stephen这是通过使用多个套接字而不是一个套接字从服务器更快地网站下载非常大的文件。这并不意味着抓取网站。
gabeio'2

不支持袜子*
Fedcomp

111

Wget不支持多个套接字连接,以加快文件下载速度。

我认为我们可以做的比garian答案还要好。

正确的方法是使用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
尼克

感谢您详细介绍参数,尼克。
thomas.han 2016年

4
自1.10版本以来,仅-s选项不再从单个服务器拆分文件。一个需要一起使用--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

55

由于尚未提到GNU parallel,因此让我给出另一种方式:

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

5
那是有趣的方法。当您需要下载大文件并且每个连接的速度受到限制时,这并不是真正适用的方法,但是在下载多个文件时很有用。
Nikola Petkanski '16

运行此命令将运行该列表8次,不是吗?我以相同的方式进行操作,而不是使用8个并行处理每一行,而是将整个列表处理了8次。
DomainsFeatured

4
不,它会将这份名单分成8个职位
Nikolay Shmyrev

好吧,我肯定在做些奇怪的事情。会解决的。感谢您及时的回复。
DomainsFeatured

1
不过,这是无用的cat。在这种有限的情况下,它是无害的,但也许您不想实施此反模式。
三胞胎

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 2014年

10
@KaiMattern:添加-nc选项:“ no clobber”-它使wget忽略Aready下载(甚至部分下载)的文件。
SF。

1
我有一个需要下载的图像列表,这对我也wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -nc很有效:非常丑陋,但是,它可以工作。:P
贾里德(Jared)2016年

1
由于某种原因断开其中一个连接会给您带来未完成的文件,而不会被其他连接所影响。此方法会导致完整性问题。
muhammedv

-b标志将在后台运行wget进程,以替代&内置的bash 作业控制。如果-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手册页


5
该程序允许无限数量的连接,这在某些情况下非常有用。
uglide


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现在作为Wget2开发,具有许多错误修复和更多功能(例如HTTP / 2支持)。

--num-threads现在--max-threads


好发现。谢谢!
user9869932 2016年

关于如何在Mac上安装wget2的任何提示?网站只记录了如何从源代码安装它以及在获取自动点点时遇到麻烦
Chris

在TravisCI脚本中,我们使用自制程序安装gettext(包括自动点)。看一下wget2存储库中的.travis_setup.sh。
rockdaboot

13

我强烈建议使用httrack。

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

默认情况下,它将做一个具有8个同时连接的镜像。Httrack有很多玩的地方。看一看。


@ aaa90210:如果您简要地解释了程序的缺陷,那将是很棒的。ArturBodera的评论提供了更多信息。
理查德

@ArturBodera可以将cookies.txt文件添加到运行程序的文件夹中,它将自动将这些cookie添加到下载头中。
Bertoncelj1

httrack不支持以下重定向
克里斯·亨特

11

正如其他海报所提到的,我建议您看看aria2。在版本1.16.1的Ubuntu手册页中:

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/。有关使用情况的信息,手册页实际上是描述性的,并在底部带有使用示例的部分。可以在http://aria2.sourceforge.net/manual/zh/html/README.html上找到在线版本。


8

wget无法通过多个连接下载,而是可以尝试使用aria2之类的其他程序。



4

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

在website.txt中,每行输入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-size默认值为20mb,如果您未将此选项和文件设置为20mb以下,则无论-xor的值是多少,它都只能在单个连接中运行。-s


1

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

0

考虑使用正则表达式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,第二个线程同步其他所有内容。

这是在具有一个10G以太网端口(10.0.0.100)的NAS和具有两个1G以太网端口(10.0.0.10和10.0.0.11)之间进行同步的最简单方法。我将两个wget线程绑定--bind-address到不同的以太网端口,并&在每行的末尾将它们并行调用。这样一来,我能够以2x 100 MB / s = 200 MB / s的总容量复制大型文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.