並列wgetはありますか?fpingに似ていますが、ダウンロード専用ですか?


14

puf(Parallel URL fetcher)しか見つかりませんでしたが、ファイルからURLを読み取ることができませんでした。何かのようなもの

 puf < urls.txt

動作しません。

サーバーにインストールされているオペレーティングシステムはUbuntuです。


これは、Pythonおよびpycurlライブラリと、スクリプト内の少しのグルーロジックを使用して実行できます。しかし、私はそのための「缶詰」ツールを知りません。
キース

@Keithこのアプローチは、urllibでgeventとして非同期ライブラリを使用するよりも優れていますか?
ムーンウォーカー

urllibは非同期で使用するようには設計されていません。libcurlには独自の非同期ループがあり、「マルチ」インターフェースを使用して少なくとも1000の同時フェッチを実行するように設定できます。
キース

@キース私はあなたの答えが一番好きなので、あなたはそれを「本当の」答えとして書いて、それに対する正当な信用を得ることができますか?
ムーンウォーカー

回答:


24

GNU Parallelを使用して、

$ parallel -j $ {jobs} wget <urls.txt

またはGNU Findutilsxargsから、

$ xargs -n 1 -P $ {jobs} wget <urls.txt

どこ${jobs}の最大数されwgetます(設定を同時に実行できるようにする-nために11つのを取得するwgetには行ごとの呼び出しurls.txt)。なし-j/ -Pparallel(のために必ずしも意味をなさないCPUコアとして、一度に多くのジョブとして実行されますwgetネットワークIOに拘束さ)、そしてxargs一度に一つを実行します。

一つの便利な機能parallelオーバーしているxargs同時に、実行中のジョブの出力を保っているが分離していますが、それを気にしない場合は、xargsプリインストールされている可能性が高いです。


最適jobsは多くの要因に依存します:パス遅延、パス帯域幅、リモートサーバーポリシーなど
dhchdhd


2

Pythonとpycurlライブラリを使用して実装できます。pycurlライブラリには、複数の同時接続を可能にする独自の偶数ループを実装する「マルチ」インターフェースがあります。

ただし、インターフェイスはかなりCに似ているため、他のより「Python的な」コードと比較すると少し面倒です。

その上に、より完全なブラウザのようなクライアントを構築するためのラッパーを作成しました。これを例として使用できます。pycopia.WWW.clientモジュールを参照してください。HTTPConnectionManagerは、マルチインターフェイスをラップします。


2

これは機能しますが、ローカルまたはリモートのDoSは適切に調整されていません。

(bandwidth=5000 jobs=8; \
 parallel      \
   --round     \
   -P $jobs    \
   --nice +5   \
   --delay 2   \
   --pipepart  \
   --cat       \
   -a urls.txt \
     wget                                \
       --limit-rate=$((bandwidth/jobs))k \
       -w 1                              \
       -nv                               \
       -i {}                             \
)

1

GNU Parallelのmanページの一部には、並列再帰wgetの例が含まれています。

https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Breadth-first-parallel-web-crawler-mirrorer

HTMLは2回ダウンロードされます。1回はリンクの抽出用、もう1回はディスクへのダウンロード用です。他のコンテンツは一度だけダウンロードされます。

再帰性を必要としない場合、一時的な回答は明らかです。


並列処理とwgetの「ソリューション」は、コンテンツを2回ダウンロードする必要があるため、すべてのマルチフェーズダウンロードが遅く、本質的に非効率的であり、帯域幅の無駄遣いを払わなければならないシステム運用者にとっても良くありません。効率的なソリューションを使用しないでください。
dhchdhd

0

paralellのダウンロードの被害者は面白がりません。各クライアントに1つの接続が提供されることを期待しているため、複数の接続を設定すると、クライアント全体が少なくなります。(つまり、これは失礼な行動と見なされます)。


1
ただし、別のサーバーからファイルをダウンロードしている可能性があるため、これは当てはまりません。
レナン

@vonbrandが言ったことに加えて、「接続が多すぎます」などのメッセージが表示され、すべてのファイルをダウンロードできない場合があります。それは少し遅くすることができる(例えば、いくつかのHTTP接続の作成と比較して、1つのHTTP接続を再利用するため)
golimarを

2
数字が正しければ、大したことではありません。たとえば、これを書いた時点で、Firefoxは永続的な接続を使用していないときにサーバーごとに15の接続を使用していました(サーバーごとに6つに制限されている永続的な接続のみに切り替えました)。他のブラウザも同様の番号を使用します。
デロバート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.