有平行的wget吗?像fping一样但只能下载吗?


15

我只找到了puf(并行URL提取程序),但无法从文件中读取url。就像是

 puf < urls.txt

也不起作用。

服务器上安装的操作系统是Ubuntu。


这可以通过Python和pycurl库以及脚本中的一些粘合逻辑来完成。但是我不知道有什么“罐头”工具。
Keith 2012年

@Keith这种方法是否比将某些异步库作为带有urllib的gevent使用更好?
Moonwalker 2012年

urllib并非旨在异步使用。libcurl有自己的异步循环,可以使用“ multi”接口将其设置为至少执行1000次同时提取。
Keith

@基思(Keith)我最喜欢您的答案,因此您可以将其写为“真实”答案以得到应有的荣誉吗?
Moonwalker 2012年

Answers:


25

使用GNU Parallel

$ parallel -j $ {jobs} wget <urls.txt

xargs来自GNU Findutils

$ xargs -n 1 -P $ {jobs} wget <urls.txt

其中${jobs}wget您希望允许并发运行的最大数量(设置-n1在中wget每行获得一次调用urls.txt)。如果不使用-j/ -Pparallel则一次将运行与CPU内核一样多的作业(这不一定wget受网络IO的束缚),并且一次xargs将运行一次。

parallel已经结束的一项不错的功能xargs是将并发运行的作业的输出分隔开,但是如果您不关心它,xargs则很有可能会预先安装。


最佳jobs取决于很多因素:路径延迟,路径带宽,远程服务器策略,等等
dhchdhd


2

您可以使用Python和pycurl库来实现。pycurl库具有“ multi”接口,该接口实现了自己的偶数循环,该循环启用了多个同时连接。

但是,该接口相当类似于C,因此与其他更“ Pythonic”的代码相比,有点麻烦。

我为此编写了一个包装程序,在其之上构建了一个更完整的类似于浏览器的客户端。您可以以此为例。参见pycopia.WWW.client模块。HTTPConnectionManager包装多接口。


2

经过适当的调整,这可以正常工作,并且不会在本地或远程DoS:

(bandwidth=5000 jobs=8; \
 parallel      \
   --round     \
   -P $jobs    \
   --nice +5   \
   --delay 2   \
   --pipepart  \
   --cat       \
   -a urls.txt \
     wget                                \
       --limit-rate=$((bandwidth/jobs))k \
       -w 1                              \
       -nv                               \
       -i {}                             \
)

1

GNU Parallel的手册页的一部分包含并行递归wget的示例。

https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Breadth-first-parallel-web-crawler-mirrorer

HTML被下载了两次:一次用于提取链接,一次用于下载到磁盘。其他内容仅下载一次。

如果您不需要递归,那么短暂的答案就显而易见了。


仅供参考,任何并行加wget“解决方案”本质上都是效率低下的,因为它需要两次下载内容,由于所有多阶段下载而导致速度很慢,并且对于必须支付所有带宽浪费的sysop也不好,因为您没有不要使用有效的解决方案。
dhchdhd

0

您的paralell下载的受害者不会被逗乐:他们希望为每个客户端提供一个连接,建立多个连接意味着总体上减少客户端。(即,这被认为是不礼貌的行为)。


1
但是他可能正在从不同的服务器下载文件,因此这并不适用。
Renan

除了@vonbrand所说的以外,您可能会得到“连接过多”之类的信息,而无法下载所有文件。而且它可能会稍慢一些(例如,与创建多个HTTP连接相比,重用一个HTTP连接)
golimar 2014年

2
只要您保持数字的健全,这没什么大不了的。例如,在您撰写本文时,Firefox 在不使用持久性连接的情况下每个服务器使用15个连接(此后,它们切换为仅尝试持久性连接,每个服务器的连接限制为6个)。其他浏览器使用相似的数字。
derobert
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.