Apakah ada wget paralel? Sesuatu seperti fping tetapi hanya untuk mengunduh?

14

Saya hanya menemukan puf (Pengambil URL paralel) tetapi saya tidak dapat membacanya untuk membaca url dari file; sesuatu seperti

 puf < urls.txt

juga tidak bekerja.

Sistem operasi yang diinstal pada server adalah Ubuntu.

Moonwalker
sumber
Ini bisa dilakukan dengan Python dan pycurl library dan sedikit lem logika dalam sebuah skrip. Tapi saya tidak tahu alat "kalengan" untuk itu.
Keith
@Keith Apakah pendekatan ini lebih baik daripada menggunakan beberapa pustaka async sebagai gevent dengan urllib?
Moonwalker
urllib tidak dirancang untuk digunakan secara sinkron. Libcurl memiliki loop async sendiri dan dapat diatur untuk melakukan setidaknya 1000 pengambilan simultan menggunakan antarmuka "multi".
Keith
@Keith saya paling suka jawaban Anda, jadi bisakah Anda menuliskannya sebagai jawaban "nyata" untuk mengambil kredit untuk itu?
Moonwalker

Jawaban:

24

Menggunakan GNU Parallel ,

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

atau xargsdari GNU Findutils ,

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

di mana ${jobs}adalah jumlah maksimum wgetyang ingin Anda memungkinkan untuk menjalankan secara bersamaan (pengaturan -nuntuk 1mendapatkan satu wgetdoa per baris di urls.txt). Tanpa -j/ -P, parallelakan menjalankan banyak pekerjaan sekaligus sebagai inti CPU (yang tidak selalu masuk akal untuk wgetdiikat oleh IO jaringan), danxargs akan berjalan satu per satu.

Salah satu fitur bagus yang paralleltelah selesai xargsadalah menjaga agar output dari pekerjaan yang dijalankan secara bersamaan terpisah, tetapi jika Anda tidak peduli tentang itu, xargskemungkinan besar akan dipasang sebelumnya.

singkat
sumber
Optimal jobstergantung pada banyak faktor: jalur latensi, jalur bandwidth, kebijakan server jarak jauh, dll.
dhchdhd
2

Anda bisa mengimplementasikannya menggunakan Python dan pycurl library. Pycurl library memiliki "multi" antarmuka yang mengimplementasikan loop bahkan sendiri yang memungkinkan beberapa koneksi simultan.

Namun antarmuka agak mirip C dan karena itu sedikit rumit dibandingkan dengan kode lain, lebih "Pythonic".

Saya menulis pembungkus untuk itu yang membangun klien seperti browser yang lebih lengkap di atasnya. Anda bisa menggunakannya sebagai contoh. Lihat modul pycopia.WWW.client . HTTPConnectionManager membungkus multi antarmuka.

Keith
sumber
2

Ini berfungsi, dan tidak akan DoS lokal atau jarak jauh, dengan penyesuaian yang tepat:

(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 {}                             \
)
dhchdhd
sumber
1

Bagian dari halaman manual GNU Parallel berisi contoh wget rekursif paralel.

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

HTML diunduh dua kali: Satu kali untuk mengekstraksi tautan dan satu kali untuk mengunduh ke disk. Konten lain hanya diunduh satu kali.

Jika Anda tidak membutuhkan jawaban ephemient rekursif tampaknya jelas.

Ole Tange
sumber
Hanya FYI yang terlambat bahwa setiap "solusi" paralel dan wget sama-sama tidak efisien karena memerlukan pengunduhan konten dua kali , lambat karena semua pengunduhan multi-fase dan juga tidak baik untuk pengurus yang harus membayar semua pemborosan bandwidth Anda karena Anda tidak dapat menggunakan solusi yang efisien.
dhchdhd
0

Para korban unduhan paralell Anda tidak akan terhibur: mereka mengharapkan satu koneksi untuk melayani setiap klien, menyiapkan beberapa koneksi berarti lebih sedikit klien secara keseluruhan. (Yaitu, ini dianggap perilaku kasar).

vonbrand
sumber
1
Tapi dia mungkin mengunduh file dari server yang berbeda, jadi ini tidak berlaku.
Renan
Selain apa yang dikatakan @vonbrand, Anda bisa mendapatkan sesuatu seperti "Terlalu banyak koneksi" dan tidak dapat mengunduh semua file. Dan itu bisa sedikit lebih lambat (misalnya menggunakan kembali satu koneksi HTTP dibandingkan dengan membuat beberapa koneksi HTTP)
golimar
2
Selama Anda menjaga angka tetap waras, itu bukan masalah besar. Misalnya, pada saat Anda menulis ini, Firefox menggunakan 15 koneksi per server ketika tidak menggunakan koneksi persisten (sejak saat itu mereka beralih ke hanya mencoba koneksi persisten, yang dibatasi hingga 6 per server). Peramban lain menggunakan nomor yang serupa.
derobert