2017-02-15 189 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並行下載所有這些文件。不知道這是如何執行與數百萬小文件雖然 - 但我想這是值得一試。