我需要一种有效的方法,从文本文件中的URL列表中下载大量(数百万)小文件。我希望用新的名称保存这些文件(来自另一个文本文件或其他地方),因为URL是长的、动态生成的胡言乱语,并且会导致最大文件名长度等方面的问题。
我第一次尝试wget,但由于您可以从文本文件中指定URL列表(例如:
wget.exe -i myURLlist.txt或用新名称重命名单个下载的文件,例如:
wget.exe -O myfilename1.jpg http://www.foo.com/longgibberish976876....2131.jpg但不是两者都是。因此,我的脚本必须为每个文件单独执行wget (使用第二种方法)。由于每次重新启动TCP连接以及其他开销(如果在文本文件中传递URL列表,wget尝试重用连接,但我不能指定文件名),这是非常缓慢的。
然后我尝试了curl,它允许您通过命令行参数传递多个curl和文件名。例如:
curl.exe
-o myfilename1.jpg http://www.foo.com/longgibberish976876....2131.jpg
-o myfilename2.jpg http://www.foo.com/longgibberish324....32432.jpg
-o .....这是一个速度的提高,因为curl将试图重复使用相同的连接,所有的URL传递给它。然而,在它开始跳过文件之前,我被限制在大约20个URL的批次上。我没有确认发生这种情况的原因,但怀疑命令行中的最大长度可能已经超过了。在任何情况下,这肯定不会扩展到100万左右的文件。我没有找到将文本文件以与wget相同的方式传递给curl的选项。
还有什么选择吗?对于我已经尝试过的两个程序是否有一些语法我不知道,或者我需要一些其他的工具?
发布于 2017-02-15 12:10:08
这是延迟,将你在其中。在一个正常的、连续的进程中,如果每个文件的延迟时间为1-3秒,您将一个接一个地支付所有这些文件,并花费1-3百万秒下载100万个文件。
诀窍是并行地支付延迟时间--比如发出64个并行请求,等待它们全部返回1-3秒--而不是按顺序执行180秒。
我向您推荐GNU并行,虽然它起源于Unix,但在Cygwin下运行。请查一些教程。
命令如下所示,一次执行64次卷曲:
parallel -j 64 -a filelist.txt curl {}发布于 2017-02-15 12:10:10
您可以通过以下方式使用aria2下载实用程序:
-j [NUMBER]选项-i [FILENAME]选项例如,假设files.txt包含:
http://rakudo.org/downloads/star/rakudo-star-2017.01.tar.gz
out=test1.file
http://rakudo.org/downloads/star/rakudo-star-2017.01.dmg
out=test2.file
http://rakudo.org/downloads/star/rakudo-star-2017.01-x86_64%20(JIT).msi
out=test3.file
http://rakudo.org/downloads/star/rakudo-star-2016.11.tar.gz
out=test4.file然后您只需运行例如aria2c -j4 -i files.txt来并行下载所有这些文件。虽然不确定如何处理数百万个小文件--但我想值得一试。
https://stackoverflow.com/questions/42247585
复制相似问题