下载很多小文件

时间:2017-02-15 11:04:54

标签: windows http batch-file curl scripting

我需要一种有效的方法从文本文件中的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和文件名。 e.g:

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个程序是否有一些语法,我不知道,还是需要其他工具?

3 个答案:

答案 0 :(得分:1)

延迟可以帮助您。在正常的顺序过程中,如果每个文件存在1-3秒的延迟,您将全部支付,一个在其他并花费1-3百万秒下载一百万个文件。

诀窍是支持延迟并行 - 输出64位并行请求并等待1-3秒让它们全部返回 - 而不是按顺序完成180秒。

我会向你推荐 GNU Parallel ,虽然它来自Unix,但是在Cygwin下运行。请查阅一些教程。

命令将是这样的,一次做64个卷发:

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

答案 1 :(得分:0)

使用curl,您只需要格式为

的文件
output = filename1.jpg
url = http://....
output = filename2.jpg
url = http://....

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

因此,您可以从网址列表中尝试使用此代码

@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 -

或者,对于非常大的网址列表(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 31 的值,如果您的列表包含超过2147483647个网址,这些样本将失败。

  2. 第一个示例将失败,网址长于aprox。 8180个字符

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

答案 2 :(得分: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并行下载所有这些文件。不知道这对数百万个小文件的表现如何 - 但我认为它值得一试。