curl
どちらも連続したファイル範囲(in、in)をダウンロードする機能を提供しますが、wget
どちらも欠点があります。つまり、シーケンスの各ダウンロード間で簡単に一時停止する方法を提供しません。一部のサーバーは数回のクイックダウンロード後にダウンロードを中断しますが、ダウンロードの間に一時停止することは丁寧で適切であり、必ずしも良いクローラー市民になることをお勧めします。たとえば、誰かが各要求間で5秒間一時停止したい場合は、追加のスクリプトなしでこれを行う方法がないことを理解してください。これは、サポートの意味を別々の要求にし、順次範囲の組み込み条項を本質的に破る。[1-100]
curl
{1..100}
wget
curl
この問題に対する解決策は、上記の所望の結果を得るためにwget
便利なフラグを使用することである。--wait=5
残念ながら、wget
他の問題もあります。 URLの特殊文字処理に問題があるようで、範囲を{1..100}
認識できないようでURLの前後に引用符を使用できないようです。これは、特殊文字を手動でエスケープする必要があることを意味します。これは管理可能ですが面倒です。
しかし、もっと重要なのは、wget
動的に名前付き出力がサポートされていないことです(この-O
フラグはここでは役に立ちません)。提供された利便性にもかかわらず、組み込みのシーケンシャルスコープサポートcurl
をバイパスし、個々の要求のスクリプトコレクションを作成したり、ダウンロード後にファイル名を編集または編集しなくても、同じ動的-o "#1.jpg"
結果を達成することは不可能です。wget
rename
これはかなり一般的な作業のようです。一連の連続したソースファイルをダウンロードし、各リクエスト間で丁寧に一時停止し、出力の名前を動的に変更します。選択肢が欠けており、上記の2つの問題を克服していますかcurl
?wget
1) 各リクエスト間で一時停止 2) ファイル名を動的に出力します。
答え1
URLの特殊文字の処理に問題があるようで、{1..100}の範囲が認識されないようで、URLの前後に引用符を使用できません。
これは、このスコープ構文が実際の機能ではなく、引数をwget
拡張するシェル(bashなど)の機能であるためです。今後に渡してwget
比較します。
$ echo abc{1..5}
abc1 abc2 abc3 abc4 abc5
または
$ ruby -e 'p ARGV' abc{1..5}
["abc1", "abc2", "abc3", "abc4", "abc5"]
パラメータを引用すると、シェルはパラメータを拡張しません。
$ echo 'abc{1..5}'
abc{1..5}
ただし、範囲を除くすべてを参照できます。
$ echo 'abc'{1..5}'def'
abc1def abc2def abc3def abc4def abc5def
しかしもっと重要なのは、wgetが動的に名前付き出力をサポートしていないことです。
wget
これらの範囲は関数ではないため、これらの範囲を処理できる関数はありませんwget
。
いいえ、1つのコマンドでこれをすべて行うことはできないようです。しかし、それはまだオネライナーに入れることができます。
for i in {1..100}; do curl "https://example.com/${i}.jpg" -o "output_${i}.jpg"; sleep 5; done
UNIXツールは、非常に集中的でスクリプト作成が容易になるように設計されています。そのうちのいくつかはすでに一般的なタスクを一度に実行するためのさまざまなオプションを提供していますが、すべてのユースケースを独自に処理することはできません。
答え2
「リクエストの間にしばらく止めることができます」への直接的な答えではなく、「良い爬虫類市民」になるための直接的な答えです。
--limit-rate
エンドポイントから「要求が多すぎます」を受け取った後、このオプションを正常に使用しました。私の任務を完了するには、少し試行錯誤と50Kを経なければなりませんでした。
curl --limit-rate 50k "https://someURL.com/resource?p=[1-100]" -o "path\to\file_#1.txt"
答え3
カール7.84.0以降では、次の--rate
パラメータを使用できます。このブログ投稿:
許容される最高速度を設定します。
--rate "N/U"
ここで、Nは整数、Uは時間単位です。サポートされる単位は、「s」(秒)、「m」(分)、「h」(時間)、「d」(日、24時間単位)です。 Uは時間単位です。 「/U」が指定されていない場合、デフォルトの時間単位は1時間あたりの転送数です。たとえば、カールに要求を毎分2回以下で実行させるには、を使用し、1時間に
--rate 2/m
25回実行するにはを使用します--rate 25/h
。
したがって、要求を5秒より頻繁に送信したくない場合は(もちろん、要求間で5秒間一時停止するのとは異なります)を使用できます--rate 12/m
。