使用 Wget 进行多个同时下载?

Posted

技术标签:

【中文标题】使用 Wget 进行多个同时下载?【英文标题】:Multiple simultaneous downloads using Wget? 【发布时间】:2011-03-26 17:45:39 【问题描述】:

我正在使用wget下载网站内容,但是wget会一个一个地下载文件。

如何使用 4 个同时连接进行 wget 下载?

【问题讨论】:

一个类似的问题有一个很好的解决方案:***.com/questions/7577615/parallel-wget-in-bash 看看这个项目github.com/rockdaboot/wget2 对于那些看到上述关于 Wget2 的评论的人,请使用新的存储库位置:gitlab.com/gnuwget/wget2。它是 GNU Wget2 的官方位置,是 Wget 的精神继承者 【参考方案1】:

使用 aria2 :

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

http://aria2.sourceforge.net

我喜欢它!

【讨论】:

我看不出这对下载网站有何帮助 - 看起来它只下载 1 个文件。如果这是真的 - 投票应该是 -ve。 我同意,这不是一个好的答案,因为 aria2 不能像 wget 或 lftp 那样进行 web 或 ftp 镜像。 lftp 进行镜像以及支持多个连接。 不要忘记-s 指定拆分数量,-k 指定每个拆分段的最小大小 - 否则您可能永远无法达到 -x 最大连接数。 @Stephen 这是为了通过使用多个连接到服务器而不是一个的套接字来更快地网站下载非常大的文件。这并不意味着抓取网站。 不支持袜子*【参考方案2】:

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

我认为我们可以比 gmarian answer 做得更好。

正确的方法是使用aria2

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

官方文档:

-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

【讨论】:

记录-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 感谢尼克详细说明参数。 自 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. @SamuelLi 更新的简写是 aria2c -x 4 -k 1M url,对我来说效果很好(每个连接限制为 100k 的服务器让我使用上述参数以 400k 的速度下载) 严格来说,aria2 确实支持递归 HTTP 下载,如果需要 -r,则使其成为 wget 的不合标准替代品。【参考方案3】:

由于还没有提到 GNU 并行,让我换一种方式:

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

【讨论】:

这很有趣。当您需要下载一个大文件并且每次连接的速度有限时并不适用,但在下载多个文件时可能很有用。 运行此命令将运行列表 8 次,不是吗?我以同样的方式做,而不是处理每行有 8 个平行线,它只处理整个列表 8 次。 不,它将列表拆分为 8 个作业 好吧,我肯定在做一些奇怪的事情。会弄清楚的。感谢您的快速回复。 不过,这是一个useless use of cat。在这种有限的情况下,它是无害的,但也许你不想使用这种反模式。【参考方案4】:

我发现(可能) a solution

在从一台服务器下载几千个日志文件的过程中 到下一个我突然需要做一些严肃的多线程 在 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 只下载“较新”的文件,这意味着它不会覆盖或重新下载文件,除非它们在服务器上的时间戳发生变化。

【讨论】:

但这不是为每个进程下载整套工件吗? @KaiMattern:添加 -nc 选项:“no clobber” - 它会导致 wget 忽略已下载(甚至部分)的文件。 我有一个需要下载的图像列表,这对我也很有效:wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -nc 非常丑陋,但是,它可以工作。 :P 由于某种原因其中一个连接中断会给您提供未完成的文件,而不会被其他连接触及。这种方法会产生完整性问题。 -b 标志将在后台运行 wget 进程,作为 bash 内置的 & 作业控制的替代方案。如果未指定-o <filename>,STDOUT 将被写入 wget-log。适合编写脚本。有关详细信息,请参阅 wget(1)。【参考方案5】:

另一个可以做到这一点的程序是axel

axel -n <NUMBER_OF_CONNECTIONS> URL

对于基本的 HTTP 身份验证,

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

Ubuntu man page.

【讨论】:

这个程序允许无限数量的连接,这在某些情况下非常有用。 很棒的工具。对于centos6.x,我使用rpm.pbone.net/index.php3/stat/4/idpl/16390122/dir/redhat_el_6/… Axel 无法进行 HTTP 基本身份验证 :( 我通常是axel -n 4 "user:pasword@http://domain.tld/path/file.ext" 我可以使用 axel 递归下载整个文件夹吗?【参考方案6】:

一个新的(但尚未发布的)工具是Mget。 它已经有许多 Wget 已知的选项,并带有一个库,可让您轻松地将(递归)下载嵌入到您自己的应用程序中。

回答你的问题:

mget --num-threads=4 [url]

更新

Mget 现在开发为Wget2,修复了许多错误并提供了更多功能(例如 HTTP/2 支持)。

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

【讨论】:

不错的发现。谢谢! 关于如何在 Mac 上安装 wget2 的任何提示?网站仅记录了如何从源代码安装它以及在获取自动点时遇到问题 在 TravisCI 脚本中,我们使用自制软件安装 gettext(包括自动点)。查看 wget2 存储库中的 .travis_setup.sh。 太棒了!我喜欢它如何进行递归下载,并使用我现有的wget 命令。如果您在编译 wget2 时遇到困难,可以使用a docker image。【参考方案7】:

我强烈建议使用 httrack。

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

默认情况下,它将做一个具有 8 个同时连接的镜像。 Httrack 有很多选择在哪里玩。看看吧。

【讨论】:

@aaa90210:如果您能简明扼要地解释程序的缺陷,那就太好了。 ArturBodera 的评论提供了更多信息。 @ArturBodera 您可以将 cookies.txt 文件添加到运行程序的文件夹中,它会自动将这些 cookie 添加到下载标题中。 httrack 不支持以下重定向【参考方案8】:

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

aria2 是一个下载文件的工具。支持的协议有 HTTP(S)、FTP、BitTorrent 和 Metalink。 aria2 可以从多个来源/协议下载文件并尝试利用您的最大下载带宽。它支持同时从 HTTP(S)/FTP 和 BitTorrent 下载文件,同时从 HTTP(S)/FTP 下载的数据上传到 BitTorrent swarm。使用 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/en/html/README.html找到。

【讨论】:

【参考方案9】:

wget 无法在多个连接中下载,您可以尝试使用其他程序,例如 aria2。

【讨论】:

【参考方案10】:

使用

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

在websites.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

【讨论】:

【参考方案11】:

试试 pcurl

http://sourceforge.net/projects/pcurl/

使用curl代替wget,分10段并行下载。

【讨论】:

【参考方案12】:

他们总是说这取决于但在镜像网站时最好的存在httrack。它超级快速且易于工作。唯一的缺点是它是所谓的支持论坛,但您可以使用official documentation 找到自己的方式。它有 GUI 和 CLI 界面,它支持 cookie 只需阅读文档 这是最好的。(使用此工具可以治愈,您可以在硬盘上下载整个网络)

httrack -c8 [url]

默认情况下最大同时连接数限制为 8 个以避免服务器过载

【讨论】:

真的吗?整个网络?【参考方案13】:

使用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 的值如何,它都只会在单连接中运行

【讨论】:

【参考方案14】:

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

【讨论】:

【参考方案15】:

您可以使用xargs

-P是进程数,例如如果设置-P 4,会同时下载四个链接,如果设置为-P 0xargs会启动尽可能多的进程,所有的链接将被下载。

cat links.txt | xargs -P 4 -I wget 

【讨论】:

【参考方案16】:

我是用gnu parallel做的

cat listoflinks.txt | parallel --bar -j $MAX_PARALLEL wget -nv 
    cat 将通过管道将行分隔的 URL 列表并行处理 --bar 标志将显示并行执行进度条 MAX_PARALLEL env var 是最大并行下载数量,请谨慎使用

提示:使用--dry-run 来查看执行命令会发生什么。 cat listoflinks.txt | parallel --dry-run --bar -j $MAX_PARALLEL wget -nv

【讨论】:

【参考方案17】:

考虑使用Regular Expressions 或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)的 NAS 之间同步的最简单方法。我通过--bind-address 将两个wget 线程绑定到不同的以太网端口,并通过将&amp; 放在每行的末尾来调用它们并行。这样我就能够以 2x 100 MB/s = 200 MB/s 的速度复制大文件。

【讨论】:

【参考方案18】:

为每个链接调用 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)

【讨论】:

以上是关于使用 Wget 进行多个同时下载?的主要内容,如果未能解决你的问题,请参考以下文章

linux下用wget下载文件

使用wget进行整站下载(转)

shell脚本编写ftp下载文件

使用wget或curl下载网站进行存档

Shell脚本之;Web自动化

wget学习笔记 —— 从网络上自动下载文件的自由工具