Download multipli multipli usando Wget?


Risposte:


197

usa aria2:

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

http://aria2.sourceforge.net

Lo adoro !!


26
Non vedo come questo aiuti a scaricare un sito Web - sembra che scarichi solo 1 file. Se questo è vero, i voti dovrebbero essere -ve.
Stephen,

8
Sono d'accordo, questa non è una buona risposta, perché aria2 non può eseguire il mirroring web o ftp come wget o lftp. lftp esegue il mirroring e supporta connessioni multiple.
Anacronista

9
Non dimenticare -sdi specificare il numero di divisioni e -kdi specificare la dimensione minima per segmento diviso, altrimenti potresti non raggiungere mai le -xconnessioni massime.
Bob

2
@Stephen questo è per scaricare file molto grandi molto più velocemente dai siti Web utilizzando più socket sul server anziché uno. Questo non è un caso per raschiare un sito web.
gabeio,

non supporta calze *
Fedcomp

111

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

19
Per documentare -x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1e-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,

Grazie per aver elaborato i parametri, Nick.
thomas.han

4
Le sole opzioni non dividono più un file da un singolo server dalla versione 1.10. È necessario utilizzare --max-connection-per-server insieme per forzare stabilire connessioni multiple. Vedi documentazione 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
La scorciatoia dell'aggiornamento di @ SamuelLi è aria2c -x 4 -k 1M urle ha funzionato bene per me (un server con un limite di 100k per connessione mi consente di scaricare a 400k con detti parametri)
EkriirkE

Criticamente, aria2non non supportare download HTTP ricorsivi, che lo rende un sostituto scadente per wgetse -rè desiderato.
user2943160

55

Dato che il parallelo GNU non è stato ancora menzionato, lasciami dare un altro modo:

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

5
Questo è un approccio interessante. Non è davvero applicabile quando è necessario scaricare un file di grandi dimensioni e si ottiene una velocità limitata per connessione, ma può essere utile quando si scaricano più file.
Nikola Petkanski,

L'esecuzione di questo comando eseguirà l'elenco 8 volte, no? L'ho fatto allo stesso modo e invece di elaborare ogni riga con 8 paralleli, elabora l'intera lista 8 volte.
Domini:

4
No, divide l'elenco su 8 lavori
Nikolay Shmyrev,

Okay, sto sicuramente facendo qualcosa di strano. Lo capirò. Grazie per la risposta rapida.
Domini:

1
Questo è un uso inutilecat , però. In questo contesto limitato, è abbastanza innocuo, ma forse non vuoi perpetrare questo antipasto.
Tripleee

39

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 -Nfa wgetscaricare 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.


11
Ma questo non scarica l'intero set di artefatti per ogni processo?
Kai Mattern,

10
@KaiMattern: aggiungi l' -ncopzione: "no clobber" - fa sì che wget ignori i file scaricati (anche parzialmente).
SF.

1
Avevo un elenco di immagini che dovevo scaricare e questo ha funzionato anche per me: wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -ncmolto brutto, ma ehi, funziona. : P
Jared,

1
Avere una di quelle connessioni interrotte per qualche motivo ti dà file incompleti, senza essere toccati da altre connessioni. Questo metodo crea problemi di integrità.
Muhammedv,

Il -bflag 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.
Paul

21

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"

Pagina man di Ubuntu .


5
questo programma consente un numero illimitato di connessioni che è molto utile in alcuni casi.
uglide


Axel non può eseguire l'autenticazione HTTP di base :(
rustyx

1
Di solito lo faccioaxel -n 4 "user:pasword@http://domain.tld/path/file.ext"
Lord Loh.

posso usare axel per scaricare in modo ricorsivo un'intera cartella?
Ryan Arief,

17

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.


Bella scoperta. Grazie!
user9869932

qualche consiglio su come installare wget2 su un mac? Il sito documenta solo come installarlo dalla fonte e ha problemi a ottenere l'autopoint
Chris

Nel nostro script TravisCI usiamo homebrew per installare gettext (che include autopoint). Dai un'occhiata a .travis_setup.sh dal repository wget2.
rockdaboot,

13

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.


@ aaa90210: Sarebbe bello se tu avessi spiegato brevemente le carenze del programma. Il commento di ArturBodera è molto più informativo.
Richard,

@ArturBodera Puoi aggiungere il file cookies.txt nella cartella da cui stai eseguendo il programma e questi aggiungerà automaticamente quei cookie all'intestazione del download.
Bertoncelj1,

httrack non supporta i seguenti reindirizzamenti
Chris Hunt,

11

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 -xflag 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 -jflag 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 .


8

wget non può scaricare in più connessioni, invece puoi provare ad usare altri programmi come aria2.



4

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

2

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


2

utilizzare xargsper far wgetfunzionare 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

-ko --min-split-sizeha 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 -xo-s


1

makepuò essere parallelizzato facilmente (ad es make -j 4.). Ad esempio, ecco un semplice Makefileche 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

0

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, He 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-addressalle 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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.