Shell

curl 在請求之間缺少暫停,wget 缺少動態文件輸出名稱,是否有現成的替代文件下載順序範圍?

  • October 25, 2020

兩者都curl提供wget了下載一系列文件([1-100]in curl{1..100}in wget)的能力,但它們每個都有一個缺點:curl沒有簡單的方法在序列中的每個下載之間暫停。一些伺服器在幾次快速下載後切斷下載,無論如何,在下載之間暫停是禮貌和適當的,無論如何都要成為一個好的爬蟲公民。如果有人想在每個請求之間暫停 5 秒,我的理解是,如果沒有額外的腳本,就無法做到這一點,這基本上破壞了通過發出單獨的請求來獲得對順序範圍的內置支持這一點。

對此的解決方案是使用wget具有方便--wait=5標誌來實現上述預期結果。不幸的是,wget還有其他問題。它似乎在處理 URL 中的特殊字元,並且不能使用 URL 周圍的引號,因為該範圍{1..100}似乎無法辨識。這意味著有時需要對特殊字元進行一些手動轉義。這是可以管理的,但很煩人。

但是,更重要的是,wget不支持動態命名輸出(該-O標誌在這裡沒有幫助)。儘管curl提供了方便,但如果不再次繞過內置的順序範圍支持並製作單個請求的腳本集合,或者在下載後必須或以其他方式編輯文件名,-o "#1.jpg"似乎無法實現相同的動態結果。wget``rename

這讓我覺得這是一項相當常見的任務:下載一系列源文件,在每個請求之間禮貌地暫停,並動態重命名輸出。我是否錯過了一些替代方案curlwget克服了上述兩個問題:1)在每個請求之間暫停 2)動態輸出文件名。

它似乎在處理 URL 中的特殊字元,並且不能使用 URL 周圍的引號,因為範圍 {1..100} 然後似乎無法辨識。

這是因為這個範圍語法實際上不是wget的一個特性,它是你的 shell(例如 bash)的一個特性,它在將參數傳遞給之前wget擴展了參數,比較:

$ echo abc{1..5}
abc1 abc2 abc3 abc4 abc5

或者

$ ruby -e 'p ARGV' abc{1..5}
["abc1", "abc2", "abc3", "abc4", "abc5"]

如果你引用這個參數,那麼 shell 將不會擴展它:

$ echo 'abc{1..5}'
abc{1..5}

但是,您可以引用除範圍之外的所有內容:

$ echo 'abc'{1..5}'def'
abc1def abc2def abc3def abc4def abc5def

然而,更重要的是,wget 不支持動態命名輸出

wget沒有處理這樣的範圍的特性,因為這樣的範圍不是wget特性。

所以不,似乎你不能用一個命令來完成所有這些。但是您仍然可以將其安裝在 oneliner 中:

for i in {1..100}; do curl "https://example.com/${i}.jpg" -o "output_${i}.jpg"; sleep 5; done

UNIX 工具被設計為相當集中但易於編寫腳本。他們中的一些人已經增加了許多選項來一次性完成常見任務,但他們永遠無法獨自涵蓋每個案例。

引用自:https://unix.stackexchange.com/questions/600543