Beberapa unduhan simultan menggunakan Wget?


Jawaban:


197

gunakan aria2:

aria2c -x 16 [url]
#          |
#          |
#          |
#          ----> the number of connections 

http://aria2.sourceforge.net

Aku menyukainya !!


26
Saya tidak melihat bagaimana ini membantu mengunduh situs web - sepertinya hanya mengunduh 1 file. Jika ini benar - suara harus -ve.
Stephen

8
Saya setuju, ini bukan jawaban yang baik, karena aria2 tidak dapat melakukan mirroring web atau ftp seperti wget atau lftp. lftp melakukan mirroring serta mendukung banyak koneksi.
Anachronist

9
Jangan lupa -suntuk menentukan jumlah pemisahan, dan -kuntuk menentukan ukuran minimum per segmen split - jika tidak, Anda mungkin tidak akan pernah mencapai -xkoneksi maks.
Bob

2
@Stephen ini untuk mengunduh file yang sangat besar jauh lebih cepat dari situs web dengan menggunakan beberapa soket ke server alih-alih satu. Ini bukan berarti untuk mengikis situs web.
gabeio

tidak mendukung kaus kaki *
Fedcomp

111

Wget tidak mendukung beberapa koneksi soket untuk mempercepat pengunduhan file.

Saya pikir kita bisa melakukan sedikit lebih baik daripada jawaban gmarian.

Cara yang benar adalah menggunakan aria2.

aria2c -x 16 -s 16 [url]
#          |    |
#          |    |
#          |    |
#          ---------> the number of connections here

19
Untuk mendokumentasikan -x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1dan-s, --split=N Download a file using N connections. If more than N URIs are given, first N URIs are used and remaining URLs are used for backup. If less than N URIs are given, those URLs are used more than once so that N connections total are made simultaneously. The number of connections to the same host is restricted by the --max-connection-per-server option. See also the --min-split-size option. Possible Values: 1-* Default: 5
Nick

Terima kasih telah menguraikan parameter, Nick.
thomas.han

4
Opsi -s saja tidak lagi membagi file dari satu server sejak rilis 1.10. Kita perlu menggunakan --max-connection-per-server bersama untuk memaksa membangun beberapa koneksi. Lihat dokumentasi aria2: About the number of connections Since 1.10.0 release, aria2 uses 1 connection per host by default and has 20MiB segment size restriction. So whatever value you specify using -s option, it uses 1 connection per host. To make it behave like 1.9.x, use --max-connection-per-server=4 --min-split-size=1M.
Samuel Li

1
Singkatan dari pembaruan @ SamuelLi adalah aria2c -x 4 -k 1M urldan bekerja dengan baik untuk saya (server dengan batas 100k per koneksi izinkan saya mengunduh pada 400k dengan parameter tersebut)
EkriirkE

Kritis, aria2tidak tidak mendukung download HTTP rekursif, membuatnya menjadi pengganti standar untuk wgetjika -rdiinginkan.
user2943160

55

Karena paralel GNU belum disebutkan, izinkan saya memberi cara lain:

cat url.list | parallel -j 8 wget -O {#}.html {}

5
Itu pendekatan yang menarik. Tidak benar-benar berlaku ketika Anda perlu mengunduh file besar dan Anda mendapatkan kecepatan terbatas per koneksi, tetapi dapat berguna saat mengunduh banyak file.
Nikola Petkanski

Menjalankan perintah ini akan menjalankan daftar 8 kali, bukan? Saya melakukannya dengan cara yang sama dan alih-alih memproses setiap baris dengan 8 paralel, itu hanya memproses seluruh daftar 8 kali.
DomainsFeatured

4
Tidak, itu membagi daftar pada 8 pekerjaan
Nikolay Shmyrev

Oke, saya pasti melakukan sesuatu yang aneh. Akan mengetahuinya. Terima kasih atas tanggapan cepatnya.
DomainsFeatured

1
Tapi itu penggunaan yang tidak bergunacat . Dalam konteks terbatas ini, ini cukup tidak berbahaya, tetapi mungkin Anda tidak ingin melakukan antipattern ini.
tripleee

39

Saya menemukan (mungkin) solusi

Dalam proses mengunduh beberapa ribu file log dari satu server ke server berikutnya, tiba-tiba saya perlu melakukan pengunduhan multithreaded serius di BSD, lebih disukai dengan Wget karena itu adalah cara paling sederhana yang dapat saya pikirkan untuk menangani ini. Sedikit melihat sekeliling membawa saya ke nugget kecil ini:

wget -r -np -N [url] &
wget -r -np -N [url] &
wget -r -np -N [url] &
wget -r -np -N [url]

Cukup ulangi wget -r -np -N [url]sebanyak mungkin utas yang Anda butuhkan ... Sekarang mengingat ini tidak cantik dan pasti ada cara yang lebih baik untuk melakukan ini tetapi jika Anda menginginkan sesuatu yang cepat dan kotor itu harus melakukan trik ...

Catatan: opsi -Nini wgethanya membuat file unduhan "yang lebih baru", yang berarti tidak akan menimpa atau mengunduh ulang file kecuali stempel waktu mereka berubah di server.


11
Tapi bukankah itu mengunduh seluruh rangkaian artefak untuk setiap proses?
Kai Mattern

10
@ KaiMattern: tambahkan -ncopsi: "no clobber" - ini menyebabkan wget untuk mengabaikan file yang sudah diunduh (bahkan sebagian).
SF.

1
Saya punya daftar gambar yang perlu saya unduh, dan ini juga berhasil bagi saya: wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -ncSangat jelek, tapi hei, itu berfungsi. : P
Jared

1
Salah satu koneksi yang rusak karena suatu alasan memberi Anda file yang tidak lengkap, tanpa disentuh oleh koneksi lain. Metode ini menciptakan masalah integritas.
muhammedv

The -bbendera akan menjalankan proses wget di latar belakang, sebagai alternatif untuk bash &kontrol pekerjaan built-in. STDOUT akan ditulis ke wget-log jika -o <filename>tidak ditentukan. Bagus untuk scripting. Lihat wget (1) untuk lebih jelasnya.
Paul

21

Program lain yang dapat melakukan ini adalah axel.

axel -n <NUMBER_OF_CONNECTIONS> URL

Untuk HTTP Auth baisic,

axel -n <NUMBER_OF_CONNECTIONS> "user:password@https://domain.tld/path/file.ext"

Halaman manual Ubuntu .


5
program ini memungkinkan jumlah koneksi yang tidak terbatas yang sangat berguna dalam beberapa kasus.
uglide


Axel tidak dapat melakukan HTTP basic auth :(
rustyx

1
Saya biasanya melakukannyaaxel -n 4 "user:pasword@http://domain.tld/path/file.ext"
Tuan Loh.

dapatkah saya menggunakan axel untuk mengunduh seluruh folder secara rekursif?
Ryan Arief

17

Alat baru (tetapi belum dirilis) adalah Mget . Ini sudah memiliki banyak opsi yang diketahui dari Wget dan dilengkapi dengan perpustakaan yang memungkinkan Anda untuk dengan mudah menanamkan (rekursif) mengunduh ke dalam aplikasi Anda sendiri.

Untuk menjawab pertanyaan Anda:

mget --num-threads=4 [url]

MEMPERBARUI

Mget sekarang dikembangkan sebagai Wget2 dengan banyak bug diperbaiki dan lebih banyak fitur (mis. Dukungan HTTP / 2).

--num-threadssekarang --max-threads.


Temuan yang bagus. Terima kasih!
user9869932

ada tips tentang cara menginstal wget2 di mac? Situs hanya mendokumentasikan cara menginstalnya dari sumber dan mengalami kesulitan mendapatkan autopoint
Chris

Di dalam skrip TravisCI kami menggunakan homebrew untuk menginstal gettext (termasuk autopoint). Lihat .travis_setup.sh dari repo wget2.
rockdaboot

13

Saya sangat menyarankan untuk menggunakan httrack.

ex: httrack -v -w http://example.com/

Ini akan melakukan mirror dengan 8 koneksi simultan sebagai default. Httrack memiliki banyak pilihan tempat bermain. Silahkan lihat.


@ aaa90210: Alangkah baiknya jika Anda menjelaskan secara singkat kekurangan program. Komentar ArturBodera jauh lebih informatif.
Richard

@ArturBodera Anda dapat menambahkan file cookies.txt ke folder tempat Anda menjalankan program dan secara otomatis akan menambahkan cookie itu ke header unduhan.
Bertoncelj1

httrack tidak mendukung pengalihan berikut
Chris Hunt

11

Seperti yang telah disebutkan poster lainnya, saya sarankan Anda melihat aria2 . Dari halaman manual Ubuntu untuk versi 1.16.1:

aria2 adalah utilitas untuk mengunduh file. Protokol yang didukung adalah HTTP (S), FTP, BitTorrent, dan Metalink. aria2 dapat mengunduh file dari berbagai sumber / protokol dan mencoba memanfaatkan bandwidth unduhan maksimum Anda. Ini mendukung pengunduhan file dari HTTP (S) / FTP dan BitTorrent secara bersamaan, sementara data yang diunduh dari HTTP (S) / FTP diunggah ke gerombolan BitTorrent. Menggunakan checksum chunk Metalink, aria2 secara otomatis memvalidasi potongan data saat mengunduh file seperti BitTorrent.

Anda dapat menggunakan -xbendera untuk menentukan jumlah koneksi maksimum per server (default: 1):

aria2c -x 16 [url] 

Jika file yang sama tersedia dari beberapa lokasi, Anda dapat memilih untuk mengunduh dari semuanya. Gunakan -jbendera untuk menentukan jumlah maksimum unduhan paralel untuk setiap URI statis (default: 5).

aria2c -j 5 [url] [url2]

Lihat http://aria2.sourceforge.net/ untuk informasi lebih lanjut. Untuk informasi penggunaan, halaman manual ini benar-benar deskriptif dan memiliki bagian di bagian bawah dengan contoh penggunaan. Versi online dapat ditemukan di http://aria2.sourceforge.net/manual/en/html/README.html .


8

wget tidak dapat mengunduh dalam banyak koneksi, sebagai gantinya Anda dapat mencoba menggunakan program lain seperti aria2.



4

menggunakan

aria2c -x 10 -i websites.txt >/dev/null 2>/dev/null &

di situs web.txt cantumkan 1 url per baris, contoh:

https://www.example.com/1.mp4
https://www.example.com/2.mp4
https://www.example.com/3.mp4
https://www.example.com/4.mp4
https://www.example.com/5.mp4

2

Mereka selalu mengatakan itu tergantung tetapi ketika datang ke mirroring sebuah situs web Httrack terbaik ada . Ini sangat cepat dan mudah digunakan. Satu-satunya downside adalah itu disebut forum dukungan tetapi Anda dapat menemukan cara Anda menggunakan dokumentasi resmi . Ini memiliki kedua antarmuka GUI dan CLI dan Mendukung cookie hanya membaca dokumen Ini adalah yang terbaik. (Jadilah menyembuhkan dengan alat ini Anda dapat mengunduh seluruh web pada hard drive Anda)

httrack -c8 [url]

Secara default, jumlah maksimum koneksi simultan terbatas pada 8 untuk menghindari server berlebih


2

gunakan xargsuntuk membuat wgetbekerja di banyak file secara paralel

#!/bin/bash

mywget()
{
    wget "$1"
}

export -f mywget

# run wget in parallel using 8 thread/connection
xargs -P 8 -n 1 -I {} bash -c "mywget '{}'" < list_urls.txt

Opsi Aria2, Cara yang benar bekerja dengan file yang lebih kecil dari 20mb

aria2c -k 2M -x 10 -s 10 [url]

-k 2M pisahkan file menjadi 2mb chunk

-katau --min-split-sizememiliki nilai default 20mb, jika Anda tidak menetapkan opsi dan file di bawah 20mb, ia hanya akan berjalan dalam satu koneksi tidak peduli berapa pun nilainya -xatau-s


1

makedapat diparalelkan dengan mudah (misalnya, make -j 4). Sebagai contoh, inilah cara sederhana yang Makefilesaya gunakan untuk mengunduh file secara paralel menggunakan wget:

BASE=http://www.somewhere.com/path/to
FILES=$(shell awk '{printf "%s.ext\n", $$1}' filelist.txt)
LOG=download.log

all: $(FILES)
    echo $(FILES)

%.ext:
    wget -N -a $(LOG) $(BASE)/$@

.PHONY: all
default: all

0

Pertimbangkan untuk menggunakan Regular Expressions atau FTP Globbing . Dengan itu Anda bisa mulai wget beberapa kali dengan berbagai kelompok karakter nama file mulai tergantung pada frekuensi kemunculannya.

Ini misalnya bagaimana saya menyinkronkan folder antara dua NAS:

wget --recursive --level 0 --no-host-directories --cut-dirs=2 --no-verbose --timestamping --backups=0 --bind-address=10.0.0.10 --user=<ftp_user> --password=<ftp_password> "ftp://10.0.0.100/foo/bar/[0-9a-hA-H]*" --directory-prefix=/volume1/foo &
wget --recursive --level 0 --no-host-directories --cut-dirs=2 --no-verbose --timestamping --backups=0 --bind-address=10.0.0.11 --user=<ftp_user> --password=<ftp_password> "ftp://10.0.0.100/foo/bar/[!0-9a-hA-H]*" --directory-prefix=/volume1/foo &

Wget pertama menyinkronkan semua file / folder dimulai dengan 0, 1, 2... F, G, Hdan utas kedua menyinkronkan yang lainnya.

Ini adalah cara termudah untuk menyinkronkan antara NAS dengan satu port ethernet 10G (10.0.0.100) dan NAS dengan dua port ethernet 1G (10.0.0.10 dan 10.0.0.11). Saya mengikat kedua benang wget --bind-addresske port ethernet yang berbeda dan menyebutnya paralel dengan meletakkan &di akhir setiap baris. Dengan itu saya dapat menyalin file besar dengan 2x 100 MB / s = 200 MB / s secara total.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.