Sto usando wget per scaricare il contenuto del sito Web, ma wget scarica i file uno per uno.
Come posso effettuare il download di wget usando 4 connessioni simultanee?
Sto usando wget per scaricare il contenuto del sito Web, ma wget scarica i file uno per uno.
Come posso effettuare il download di wget usando 4 connessioni simultanee?
Risposte:
usa aria2:
aria2c -x 16 [url]
# |
# |
# |
# ----> the number of connections
Lo adoro !!
-s
di specificare il numero di divisioni e -k
di specificare la dimensione minima per segmento diviso, altrimenti potresti non raggiungere mai le -x
connessioni massime.
Wget non supporta connessioni multiple per velocizzare il download di file.
Penso che possiamo fare un po 'meglio della risposta di Gmarian.
Il modo corretto è usare 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
e-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
e ha funzionato bene per me (un server con un limite di 100k per connessione mi consente di scaricare a 400k con detti parametri)
aria2
non non supportare download HTTP ricorsivi, che lo rende un sostituto scadente per wget
se -r
è desiderato.
Dato che il parallelo GNU non è stato ancora menzionato, lasciami dare un altro modo:
cat url.list | parallel -j 8 wget -O {#}.html {}
cat
, però. In questo contesto limitato, è abbastanza innocuo, ma forse non vuoi perpetrare questo antipasto.
Ho trovato (probabilmente) una soluzione
Nel processo di download di alcune migliaia di file di registro da un server all'altro, improvvisamente ho avuto la necessità di eseguire un serio download multithreading in BSD, preferibilmente con Wget poiché era il modo più semplice di pensare a gestirlo. Una piccola occhiata in giro mi ha portato a questa piccola pepita:
wget -r -np -N [url] & wget -r -np -N [url] & wget -r -np -N [url] & wget -r -np -N [url]
Basta ripetere il
wget -r -np -N [url]
numero di thread di cui hai bisogno ... Ora dato che questo non è carino e ci sono sicuramente modi migliori per farlo, ma se vuoi qualcosa di veloce e sporco dovrebbe fare il trucco ...
Nota: l'opzione -N
fa wget
scaricare solo i file "più recenti", il che significa che non sovrascriverà o riscaricherà i file a meno che il loro timestamp non cambi sul server.
-nc
opzione: "no clobber" - fa sì che wget ignori i file scaricati (anche parzialmente).
wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -nc
molto brutto, ma ehi, funziona. : P
-b
flag eseguirà il processo di wget in background, in alternativa al &
controllo del lavoro di bash integrato. STDOUT verrà scritto su wget-log se -o <filename>
non specificato. Buono per lo scripting. Vedi wget (1) per maggiori dettagli.
Un altro programma che può farlo è axel
.
axel -n <NUMBER_OF_CONNECTIONS> URL
Per baisic HTTP Auth,
axel -n <NUMBER_OF_CONNECTIONS> "user:password@https://domain.tld/path/file.ext"
axel -n 4 "user:pasword@http://domain.tld/path/file.ext"
Un nuovo strumento (ma non ancora rilasciato) è Mget . Ha già molte opzioni conosciute da Wget e viene fornito con una libreria che consente di incorporare facilmente (ricorsivo) il download nella propria applicazione.
Per rispondere alla tua domanda:
mget --num-threads=4 [url]
AGGIORNARE
Mget è ora sviluppato come Wget2 con molti bug corretti e più funzionalità (ad es. Supporto HTTP / 2).
--num-threads
è adesso --max-threads
.
Consiglio vivamente di usare httrack.
ex: httrack -v -w http://example.com/
Farà un mirror con 8 connessioni simultanee come impostazione predefinita. Httrack ha tantissime opzioni su cui giocare. Dare un'occhiata.
Come altri poster hanno menzionato, ti suggerisco di dare un'occhiata a aria2 . Dalla pagina man di Ubuntu per la versione 1.16.1:
aria2 è un'utilità per il download di file. I protocolli supportati sono HTTP (S), FTP, BitTorrent e Metalink. aria2 può scaricare un file da più fonti / protocolli e tenta di utilizzare la massima larghezza di banda di download. Supporta il download di un file da HTTP (S) / FTP e BitTorrent contemporaneamente, mentre i dati scaricati da HTTP (S) / FTP vengono caricati nello sciame BitTorrent. Utilizzando i checksum dei blocchi di Metalink, aria2 convalida automaticamente blocchi di dati durante il download di un file come BitTorrent.
È possibile utilizzare il -x
flag per specificare il numero massimo di connessioni per server (impostazione predefinita: 1):
aria2c -x 16 [url]
Se lo stesso file è disponibile da più posizioni, puoi scegliere di scaricare da tutte. Utilizzare il -j
flag per specificare il numero massimo di download paralleli per ogni URI statico (impostazione predefinita: 5).
aria2c -j 5 [url] [url2]
Dai un'occhiata a http://aria2.sourceforge.net/ per maggiori informazioni. Per informazioni sull'uso, la pagina man è davvero descrittiva e ha una sezione in fondo con esempi di utilizzo. Una versione online è disponibile all'indirizzo http://aria2.sourceforge.net/manual/en/html/README.html .
wget non può scaricare in più connessioni, invece puoi provare ad usare altri programmi come aria2.
prova pcurl
http://sourceforge.net/projects/pcurl/
usa curl invece di wget, scarica in 10 segmenti in parallelo.
uso
aria2c -x 10 -i websites.txt >/dev/null 2>/dev/null &
in website.txt inserisci 1 url per riga, ad esempio:
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
Dicono sempre che dipende, ma quando si tratta di eseguire il mirroring di un sito Web Il meglio esiste httrack . È super veloce e facile da lavorare. L'unico aspetto negativo è il cosiddetto forum di supporto, ma puoi trovare la tua strada utilizzando la documentazione ufficiale . Ha sia l'interfaccia GUI che l'interfaccia CLI e supporta i cookie basta leggere i documenti Questo è il migliore. (Fai attenzione con questo strumento puoi scaricare l'intero web sul tuo hard disk)
httrack -c8 [url]
Per impostazione predefinita, il numero massimo di connessioni simultanee è limitato a 8 per evitare il sovraccarico del server
utilizzare xargs
per far wget
funzionare in più file in parallelo
#!/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
Opzioni Aria2, Il modo giusto di lavorare con file di dimensioni inferiori a 20 MB
aria2c -k 2M -x 10 -s 10 [url]
-k 2M
dividere il file in blocchi da 2 MB
-k
o --min-split-size
ha un valore predefinito di 20 MB, se non si imposta questa opzione e il file è inferiore a 20 MB, verrà eseguito solo in una singola connessione, indipendentemente dal valore di -x
o-s
make
può essere parallelizzato facilmente (ad es make -j 4
.). Ad esempio, ecco un semplice Makefile
che sto usando per scaricare file in parallelo usando 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
Prendi in considerazione l'utilizzo di espressioni regolari o FTP Globbing . In questo modo potresti iniziare a wget più volte con diversi gruppi di caratteri iniziali del nome file a seconda della loro frequenza di occorrenza.
Questo è ad esempio il modo in cui sincronizzo una cartella tra due 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 &
Il primo wget sincronizza tutti i file / cartelle che iniziano con 0, 1, 2... F, G, H
e il secondo thread sincronizza tutto il resto.
Questo è stato il modo più semplice per sincronizzare tra un NAS con una porta Ethernet 10G (10.0.0.100) e un NAS con due porte Ethernet 1G (10.0.0.10 e 10.0.0.11). Ho legato i due thread wget --bind-address
alle diverse porte Ethernet e li ho chiamati paralleli mettendo &
alla fine di ogni linea. Con ciò sono stato in grado di copiare file di grandi dimensioni con 2x 100 MB / s = 200 MB / s in totale.