Saya menggunakan wget untuk mengunduh konten situs web, tetapi wget mengunduh file satu per satu.
Bagaimana cara saya membuat unduhan wget menggunakan 4 koneksi simultan?
Saya menggunakan wget untuk mengunduh konten situs web, tetapi wget mengunduh file satu per satu.
Bagaimana cara saya membuat unduhan wget menggunakan 4 koneksi simultan?
Jawaban:
gunakan aria2:
aria2c -x 16 [url]
# |
# |
# |
# ----> the number of connections
Aku menyukainya !!
-s
untuk menentukan jumlah pemisahan, dan -k
untuk menentukan ukuran minimum per segmen split - jika tidak, Anda mungkin tidak akan pernah mencapai -x
koneksi maks.
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
-x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1
dan-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
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.
aria2c -x 4 -k 1M url
dan bekerja dengan baik untuk saya (server dengan batas 100k per koneksi izinkan saya mengunduh pada 400k dengan parameter tersebut)
aria2
tidak tidak mendukung download HTTP rekursif, membuatnya menjadi pengganti standar untuk wget
jika -r
diinginkan.
Karena paralel GNU belum disebutkan, izinkan saya memberi cara lain:
cat url.list | parallel -j 8 wget -O {#}.html {}
cat
. Dalam konteks terbatas ini, ini cukup tidak berbahaya, tetapi mungkin Anda tidak ingin melakukan antipattern ini.
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 -N
ini wget
hanya membuat file unduhan "yang lebih baru", yang berarti tidak akan menimpa atau mengunduh ulang file kecuali stempel waktu mereka berubah di server.
-nc
opsi: "no clobber" - ini menyebabkan wget untuk mengabaikan file yang sudah diunduh (bahkan sebagian).
wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -nc
Sangat jelek, tapi hei, itu berfungsi. : P
-b
bendera 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.
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"
axel -n 4 "user:pasword@http://domain.tld/path/file.ext"
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-threads
sekarang --max-threads
.
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.
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 -x
bendera 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 -j
bendera 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 .
wget tidak dapat mengunduh dalam banyak koneksi, sebagai gantinya Anda dapat mencoba menggunakan program lain seperti aria2.
coba pcurl
http://sourceforge.net/projects/pcurl/
menggunakan curl alih-alih wget, unduhan dalam 10 segmen secara paralel.
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
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
gunakan xargs
untuk membuat wget
bekerja 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
-k
atau --min-split-size
memiliki 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 -x
atau-s
make
dapat diparalelkan dengan mudah (misalnya, make -j 4
). Sebagai contoh, inilah cara sederhana yang Makefile
saya 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
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, H
dan 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-address
ke 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.