我需要一种有效的方法从文本文件中的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个程序是否有一些语法,我不知道,还是需要其他工具?
答案 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 -
备注:
由于批处理文件中的算术运算限制为低于2 31 的值,如果您的列表包含超过2147483647个网址,这些样本将失败。
第一个示例将失败,网址长于aprox。 8180个字符
第二个样本将失败,网址超过1021个字符,并将在源文件中的空行终止。
答案 2 :(得分:0)
您可以使用aria2
下载实用程序:
-j [NUMBER]
选项-i [FILENAME]
选项,用于在文本文件中提供URL和输出文件名例如,假设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
并行下载所有这些文件。不知道这对数百万个小文件的表现如何 - 但我认为它值得一试。