我想使用wget下载几个网页,为此我使用以下BASH:
wget -x --load-cookies cookies.txt http://www.example.com/1
wget -x --load-cookies cookies.txt http://www.example.com/2
wget -x --load-cookies cookies.txt http://www.example.com/3
wget -x --load-cookies cookies.txt http://www.example.com/4
wget -x --load-cookies cookies.txt http://www.example.com/5
wget -x --load-cookies cookies.txt http://www.example.com/6
wget -x --load-cookies cookies.txt http://www.example.com/7
wget -x --load-cookies cookies.txt http://www.example.com/8
使用Cygwin:
sh download.sh
但是,每次下载文件时它重新连接到服务器并且需要时间,是否有更有效的方法从同一服务器大量下载文件(example.com /...)?
答案 0 :(得分:1)
您可以尝试mget。它基本上是一个多线程wget
。
答案 1 :(得分:0)
我同意打开新进程的一些先前答案,以便命令并行运行。话虽如此,每当我做这样的事情时,我都会使用一个非常方便的工具(也适用于Cygwin),该工具将是GNU Parallel。
安装parallel
后,在您的示例中,我将执行以下操作:
$ for i in {1..8}; do echo $i; done | parallel -j+0 wget -x --load-cookies cookies.txt http://www.example.com/{}
for
循环只是将不同的参数逐行输入parallel
。有多种方法可以做到这一点,但这只是一个例子。-j+0
告诉parallel
将每个作业分散到尽可能多的内核中。 man parallel
将解释更多选项,并且它是非常可调整的。您可以查看并根据您的规格进行调整。基本上,如果你有4个核心并运行top
命令,你会看到4个独立的wget
进程同时运行。一旦退出,另一个就会开始,直到所有8个工作完成。
由于我们主要关注网络套接字而不一定是处理,其他解决方案可能效果更好,但这只是一种简单的方法来完成你正在尝试的东西,就像我说的,parallel
是功能非常丰富,因此您可以调整该命令,使其更好/更快。
这绝对值得尝试,因为例如,我不确定如果将它分成两个并行作业会发生什么 - 这可能是4核系统的完美答案:
$ for i in {1..4}; do echo $i; done | parallel -j+0 wget -x --load-cookies cookies.txt http://www.example.com/{}
$ for i in {5..8}; do echo $i; done | parallel -j+0 wget -x --load-cookies cookies.txt http://www.example.com/{}
你仍然必须在子shell中运行这些命令,以便它们不会按顺序执行(使用(...)&
等等,正如其他人所建议的那样。如果我错了,有人请纠正我,但它会可能看起来像这样:
$ (for i in {1..4}; do echo $i; done | parallel -j+0 wget -x --load-cookies cookies.txt http://www.example.com/{})&
$ (for i in {5..8}; do echo $i; done | parallel -j+0 wget -x --load-cookies cookies.txt http://www.example.com/{})&
来自top
的伪输出可能看起来像这样:
wget
wget
wget
wget
parallel
wget
wget
wget
wget
parallel
所有这一切,我从未使用mget
,这可能是工作的正确工具。关于Aria2
的回复有点偏,但他们说这是一个能够进行多线程下载的命令行下载工具是正确的。
答案 2 :(得分:-1)
不使用wget。 Wget仍然是顺序的,意味着它启动一个文件,将其部分下载直到它完成并断开连接。这里无法下载同一连接上的所有文件。你可能会使用像Aria2c这样的东西来做这件事,但我不确定你能得到多少改善。