Wget

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

wget is een Unix command line-routine om bestanden te downloaden over http of ftp. Erg handig in het automatiseren van processen, of het leegtrekken of migreren van een website. Het is het broertje van cURL.

Eén bestand downloaden via http

wget https://downloads.wordpress.org/plugin/akismet.3.1.3.zip

Het bestand belandt in de CWD - current working directory onder dezelfde naam als op de bronlocatie.

Output-specificatie

De optie -O (hoofdletter) of --output-document = file zorgt dat de output niet naar de betreffende bestanden wordt geschreven, maar wordt samengevoegd (concatenated), en naar een bestemming naar keuze wordt geleid.

Naar bestand

Voorbeeld:

wget http://downloads.wordpress.org/plugin/w3-total-cache.zip -O ~/in3/w3-total-cache.zip

Wat niet werkt:

wget http://downloads.wordpress.org/plugin/w3-total-cache.zip ~/in3/w3-total-cache.zip # Laatste argument wordt genegeerd
wget http://downloads.wordpress.org/plugin/w3-total-cache.zip -O ~/in3 # Foutmelding: Laatste argument moet inclusief bestandsnaam zijn

Naar standaard-output

Door het argument - mee te geven met -O, wordt de output naar standard output gestuurd, waarbij link-conversie gedeactiveerd wordt (om te schrijven naar een bestand genaamd -, gebruik argument ./-). Dit is handig voor piping.

Voorbeeld:

wget -O- https://updates.signal.org/desktop/apt/keys.asc | sudo apt-key add -

Hierbij wordt het bestand keys.asc gebruikt als argument voor sudo apt-key add.

Map met bestanden downloaden - Kan meestal niet

Ik heb ooit geprobeerd om recursief een map-met-inhoud te downloaden met zoiets als dit bron:

wget --recursive --no-parent --reject "index.html" -e robots=off -nH -r http://media.example.com/mijn_map/

Dat werkt echter niet, vermoedelijk om een simpele reden: Een webserver vertelt doorgaans niet welke bestanden er in een map staan.

Dit kan wél werken als er een index.html-bestand in de map staat, dat links bevat naar alle andere bestanden.

Ander voorbeeld:

  • Een plugin staat op een eigen webserver in map media.example.com/my_plugin. Deze plugin bestaat uit 30 mappen met in totaal 50 bestanden. Er is geen index.html-bestandin 30 mappen
  • Deze map kun je dus niet downloaden
  • Oplossing: Stop deze mappen met inhoud in een archiefbestand.

Hele site downloaden via http

wget -r -l 25 http://www.example.com
  • -r: Recursie
  • -l: Met een recursie-level van 25.

Hele site downloaden via ftp

Bv. (met een recursie-level van 25):

wget -r -l 25 ftp://username:password@ip.of.old.host

Escape codes

Onder andere spaties, uitroeptekens en apestaartjes moeten ge-escaped worden. In mijn ervaring levert dat vaak ondoorgrondelijke syntaxis op. Om dat beheersbaar te houden:

  • Benoem de verschillende argumenten van het commando apart
  • Escape met behulp van apostropjes - "'"
  • Breng argumenten onder in aparte variabelen. Zie het script verderop in dit artikel ter illustratie.

Voorbeeld:

wget -q -T 60 --retry-connrefused -t 5 --waitretry=60 --user='ftp2.company.com|company2013' 
--password='!company2013' -N -P "data/parser/company/" "ftp://ftp2.company.com/Production/somedata.zip"

Spanning hosts

http://www.gnu.org/software/wget/manual/html_node/Spanning-Hosts.html

Script downloadsite.sh

#!/bin/sh

#########################################
# Haal via wget (FTP) een site hierheen!
#########################################
#
# Inloggegevens bron-FTP-account
#
inlognaam="inlognaam"
wachtwoord="wachtwoord"
bron="ftp://example.com"

#
# Kopiëer alles naar een 'in'-map
#
doel="/home/account/in3"

#
# -r - Recursie
# -c - Continue   Handig als je verder wilt gaan met een eerdere download
# -l - Level      Level of recursie. Standaard is 5, en dat is te weinig!
#
cd $doel

wget -r -c -l 25 --user=$inlognaam --password=$wachtwoord $bron

Voorbeeld: Mediawiki downloaden

De working directory is de doellocatie van de MediaWiki-installatie. Vandaaruit (bron):

wget http://releases.wikimedia.org/mediawiki/1.24/mediawiki-1.24.2.tar.gz

Error 420: Too Many Requests

Deze foutmelding geeft aan dat de server vindt dat je te veel vraagt. Oplossing: Commando herhaaldelijk geven, maar alleen nieuwe bestanden opslaan. Bv.:

wget -r -c http://www.example.com

Alleen afbeeldingen downloaden

Bv. [1]:

wget -nd -r -l 25 -A jpeg,jpg,bmp,gif,png https://example.com

Zie ook

Bronnen