Magazine Tecnologia

How To: Scaricare con Wget

Creato il 11 aprile 2011 da Idl3

Siamo ormai abituati a scaricare da Internet con dei download manager sempre piu' potenti e pesanti. In un'altra guida avevo introdotto l'uso di " Aria2, il downloader senza interfaccia grafica (anche torrent)", questa volta vediamo il tradizionale GNU Wget.

Wget e'un programma per lo scaricamento non-interattivo di file dal Web attraverso i protocolli HTTP, HTTPS, FTP, e proxy HTTP. La sintassi e':
$ wget [opzione]... [URL]...
dove URL e' qualcosa di questo tipo ftp://host[:porta]/directory/file o ftp://user:password@host/path (se si tratta di protocollo HTTP ovviamente va messo http al posto di ftp). Se dovessimo scaricare un file da un' area protetta di un sito, possiamo indicare nome utente e password anche in questo modo:
$ wget --user=NOMEUTENTE --password='LAMIAPASSWORD' http://www.sito.ext/directory/protetta/file.ext
oltre che:
$ wget http://NOMEUTENTE:[email protected]/directory/protetta/file.ext

Wget dispone di un gran numero di opzioni, tramite le quali e' possibile fare altrettante cose, potete vedere le principali opzioni dando da terminale questo comando:
$ wget -h
ma vediamo alcuni esempi.

Download di un intero sito

Se dobbiamo fare il backup di un sito, o vogliamo comunque avere un mirror in locale di un sito, possiamo scaricarci una copia in locale di tutti i file e le directory con Wget. Lo facciamo col comando:
$ wget -m http://www.sito.ext
l'opzione-m sta appunto per " mirror this site". Se volessimo scaricare anche le pagine esterne al sito, ma linkate dal sito, dobbiamo aggiungere alcune opzioni, e il comando diventa:
$ wget -H -r --level=1 -k -p http://www.sito.ext
in modo da scaricare ricorsivamente (-r) tutte le pagine del sito, compreso un livello (--level=1) di altri siti linkati (-H) e comprese le immagini e altri componenti delle pagine (-p), convertendo i riferimenti dei link delle pagine scaricate (-k) cosi' che possiamo navigare tra le pagine in locale.
Aggiungendo l'opzione-P possiamo indicare la directory nella quale scaricare il sito:
$ wget -m -p -k -P /home/utente/directory/locale http://www.sito.ext
Possiamo escludere alcuni tipi di file dallo scaricamento, ad esempio i PDF:
$ wget -m --reject=pdf http://www.sito.ext
oppure scaricare solo un tipo di file, ad esempio solo PDF:
$ wget -r -A.pdf http://www.sito.ext
Wget tende a rispettare il file robots.txt e dovremmo farlo anche noi, ma a volte puo' servirci dirgli di non farlo, cosi' da scaricare anche file e pagine che il file robors.txt esclude. Lo facciamo cosi':
$ wget -m -erobots=off http://www.sito.ext
Ovviamente fate attenzione alla grandezza di cio' che avete intenzione di scaricare, fare un backup di Internet non e' consigliabile.

Download di file

Se scarichiamo file di grandi dimensioni, o comunque la nostra connessione non e' delle migliori, e' consigliabile utilizzare l'opzione -c in modo da poter proseguire i download interrotti da dove si erano fermati. Il comando sara':
$ wget -c http://www.sito.ext/directory/file.ext
se preferiamo scaricare il file dandogli un nome diverso lo facciamo con questo comando:
$ wget -c --output-document=nomefile.ext http://www.sito.ext/directory/file.ext
Nel caso doveste scaricare un certo numero di file (magari anche da siti diversi), o date il comando da terminale indicando i singoli file:
$ wget http://www.sito.ext/directory/file.ext http://www.altrosito.ext/directory/altrofile.ext http://www.ancora.ext/directory/ancoraunaltro.ext
oppure scriviamo uno per riga gli URL dei vari file in un file di elenco (ad esempio elenco.txt), in modo che il contenuto del file risulti:

http://www.sito.ext/directory/file.ext

http://www.altrosito.ext/directory/altrofile.ext


http://www.ancora.ext/directory/ancoraunaltro.ext

A questo punto da terminale diamo il seguente comando:
$ wget -i elenco.txt
per scaricare i file il cui URL e' contenuto nel file di testo elenco.txt. Anche in questo caso, come nei precedenti, a seconda della dimensione dei file e' consigliabile usare l'opzione-c:
$ wget -c -i elenco.txt
Se non vogliamo che wget ci usi tutta la banda possiamo porre un limite, cosi':
$ wget -c --limit-rate=100k http://cdimage.debian.org/debian-cd/6.0.1a/amd64/iso-dvd/debian-6.0.1a-amd64-DVD-1.iso
se vogliamo che wget crei un file con i vari ed eventuali messaggi, diamo questo comando:
$ wget -c -o /tmp/debiandvd.log --limit-rate=100k http://cdimage.debian.org/debian-cd/6.0.1a/amd64/iso-dvd/debian-6.0.1a-amd64-DVD-1.iso
Alcuni server sono molto fiscali e possono limitare o impedire di scaricare file e pagine, serve dunque mascherarci da browser, lo facciamo indicando un user agent. Ne avevo scritto a proposito di " HowTo: opzioni lingua e user agent di w3m". Il comando sara':
$ wget --user-agent="Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.19) Gecko/2011032314 Iceweasel/3.0.6 (Debian-3.0.6-3)" http://www.sito.ext/directory/file.ext
Scegliete voi l' user agent da indicare.
Per verificare l'esistenza di un file utilizziamo l'opzione --spider:
$ wget --spider http://www.sito.ext/directory/file.ext
Possiamo indicare un limite alla grandezza dei file da scaricare (ad esempio 5MB):
$ wget -m --quota=5m -i elenco.txt

Casi particolari

Se vogliamo scaricare dei file che sui sito o sui siti vengono aggiornati continuamente, ad esempio dei server nei quali vengono aggiunti nuovi file pdf/mp3/avi/ecc. e aggiornati i vecchi, un modo per avere sempre in locale i file aggiornati con Wget potrebbe essere il seguente. Prima di tutto creiamo un file di testo:
$ nano elenco.txt
nel quale andremo ad incollare gli indirizzi dei vari siti che contengono i file che ci interessano, ad esempio:

http://www.sitovideo.ext/directory/dei/video/
ftp://video.sito.ext/

http://www.altrosito.ext/video/

A questo punto il comando sara':
$ wget -r -w3 --level=1 -H --tries=1 -nd -N -np -A.avi -erobots=off -i elenco.txt
con questo comando diciamo a wget di scaricare i file aspettando tre sencondi tra uno scaricamento e l'altro (-w3), scendendo nelle varie directory e sottodirectory (-r) andando anche negli altri siti likati (-H), con una profondita' di ricorsione di 1 (--level=1, scaricando solo i file AVI (-A.avi) con un numero di tentativi pari a 1 (--tries=1) senza creare nuove directory (-nd) e senza badare al file robots.txt (-erobots=off), senza scaricare i file piu' vecchi di quelli presenti in locale (-N). Vediamo il perche' di alcune opzioni.
L'opzione-nd ci serve per far si che tutti i file vadano a finire in un'unico punto, cosi' che con l'opzione -N non dobbiamo scaricare file che magari erano vecchi in un sito ma aggiornati in un altro. Infine l'opzione -w3 serve per essere educati e non sovraccaricare di richieste i poveri server.
Un altro caso particolare e' quello dei caratteri jolly. Se volessimo scaricare tutti i file PNG da una directory il comando sarebbe (alcuni server impediscono questo metodo):
$ wget ftp://www.sito.ext/immagini/di/vari/formati/*.png
Se volessimo controllare che il nostro bookmark non contenga siti e/o pagine non piu' esistenti possiamo dare questo comando:
$ wget --spider --force-html -o /tmp/bookmarks.log -i bookmarks.html
leggendo i messaggi contenuti nel file bookmarks.log potremmo cosi' scoprire quali pagine e/o siti non sono piu' raggiungibili.
Se dobbiamo scaricare da una directory di un sito dei file del tipo Foto_001.jpg, Foto_002.jpg, ..., Foto_100.jpg, possiamo farlo in vari modi. Se abbiamo come versione della Bash almeno la 4.0 possiamo fare cosi':
$ wget http://www.sito.ext/directory/immagini/Foto_{001..100}.jpg
in caso contrario dovrebbe essere anche possibile fare cosi':
$ wget -A "[001-100].jpg" http://www.sito.ext/directory/immagini/Foto_*
oppure certamente possiamo farlo cosi':
$ for i in {001..100}; do wget "http://www.sito.ext/directory/immagini/Foto_$i.jpg"; done
o usando Curl:
$ curl http://www.sito.ext/directory/immagini/Foto_[001-100].jpg

Infine, le ultime opzioni, -np che dice a Wget di non risalire alla directory superiore, -nc che dice a Wget di non scaricare file gia' presenti in locale e -q che avvia Wget in modo silenzioso (senza che restituisca output su terminale).

Le opzioni sono ancora tante, inoltre e' possibile programmare Wget con cron e/o creare uno script in Bash. Comunque consiglio la lettura del manuale:
$ man wget
come sempre.


Potrebbero interessarti anche :

Ritornare alla prima pagina di Logo Paperblog

Possono interessarti anche questi articoli :