2017-02-15 192 views
3

我需要一种有效的方式从文本文件中的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,它可以让你通过命令行参数传递多个URL和文件名。例如:

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。我没有确认为什么发生这种情况,但怀疑命令行中的最大长度可能已经超过。在任何情况下,这当然不会扩展到一百万左右的文件。我没有找到像使用wget一样的方式传递文本文件来卷曲的选项。

剩下哪些选项?有没有我已经尝试过的2个程序的一些语法,我不知道,还是我需要其他工具?

+0

我很害怕你正在打墙,你需要跳过一些自定义编程。既然SO是一个程序员回答编程问题的在线社区,我假设你不害怕进入自定义解决方案的编程。如果您遇到一些特定的编程问题,请使用您选择的语言进行试用并返回。 –

回答

0

随着curl你只需要一个文件格式

output = filename1.jpg 
url = http://.... 
output = filename2.jpg 
url = http://.... 

,并用从标准输入-K -使用-K file开关来处理它或者动态地生成并阅读列表。

所以,从URL列表,你可以用这个代码

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "count=0" 
    (for /f "usebackq delims=" %%a in ("urlList.txt") do @(
     >nul set /a "count+=1" 
     call echo(output = file%%^^count%%.jpg 
     echo(url = %%a 
    )) | curl -K - 

尝试或者,真正的大的URL列表(for /f需要加载完整的文件到内存中),可以使用

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    < urlList.txt (
     cmd /e /v /q /c"for /l %%a in (1 1 2147483647) do set /p.=&&(echo(output = file%%a.jpg&echo(url = !.!)||exit" 
    ) | curl -K - 

笔记

  1. 由于批处理文件中的算术运算被限制为小于2的值,因此如果列表包含超过2147483647个URL,那么这些样本将失败。

  2. 第一个样本将失败,网址比aprox长。 8180个字符

  3. 第二个示例将失败,且网址超过1021个字符,并且将终止源文件中的空行。

1

这是延迟,会做你在一个正常的,连续的过程,如果有涉及的每个文件1-3秒的延迟,你将支付他们所有,一前一后并花费1-3百万秒下载一百万个文件。

诀窍是要并行潜伏期- 如果顺序进行的,而不是180秒 - 放出来了,说64,平行的请求,并等待1-3秒,他们全部返回。

我会推荐GNU并行给你,虽然它的Unix起源,运行在Cygwin下。请查阅一些教程。

该命令将是这样的,在一个时间做64个卷发:

parallel -j 64 -a filelist.txt curl {} 
0

可以使用aria2下载工具有:

例如,假设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并行下载所有这些文件。不知道这是如何执行与数百万小文件虽然 - 但我想这是值得一试。