wget
est un outil qui permet le téléchargement de manière non interactive de
contenu sur des sites via FTP/HTTP(s), etc.
Dans son utilisation la plus basique, il permet de télécharger du contenu en
tapant simplement wget ${url}
dans son émulateur de terminal favori.
Cependant, parcourir sa documentation permet de se rendre compte de sa puissance.
Un autre outil proposant des fonctionnalités similaires est curl
.
Il permet à envoyer de manière simple des requêtes sur internet. Un coup d'œil à sa
documentation nous montre qu'il gère
une plus grande quantité protocoles comparativement à wget
.
Cependant, wget
peut suivre les liens (récursivement), filtrer du contenu pour
les requêtes, convertir en liens relatifs (ou absolu),…
Ainsi, ces deux outils couvrent des cas d'usage différents (même si leur
intersection est non-vide).
Pour résumer, wget
se montrera être un couteau-suisse très utile dans les cas
où l'on souhaite parcourir un site internet vu comme un graphe de pages liées
entre-elles par des liens hypertextes là où curl
se montrera plus intéressant
pour la manipulation de requêtes à bas niveau.
De plus, pour l'analyse des requêtes, les navigateurs modernes permettent
d'exporter les requêtes directement sous forme de commande curl
depuis
l'inspecteur web. Cela permet de les bricoler de manière plus simple que depuis
netcat par exemple.
Pour conclure cette introduction, comme je ne suis pas un wget
/curl
poweruser, il y aura sans doute de nombreuses informations qui seront assez
basiques.
Néanmoins, comme je l'ai indiqué, ce billet me servira de pense-bête pour
réduire mon nombre de requêtes à Google.
wget
Télécharger un dossier
Pour télécharger un dossier spécifique:
wget --recursive --no-parent --no-host-directories --cut-dirs=<n> --accept <extensions autorisées> <url>
Où <n>
représente le la profondeur de recherche dans les sous-dossiers. Par
exemple, si l'on souhaite télécharger le contenu de ce blog sans télécharger les
images de couverture des articles situés à l'adresse “https://blog.epheme.re/images/covers/”, on peut utiliser cette commande:
wget -rnpnH --cut-dirs=2 -A jpg https://blog.epheme.re/
Une méthode plus simple pour ce cas d'usage, si l'on n'a pas besoin de la
structure des répertoires, il est possible d’utiliser l’option
--no-directories
/-nd
. En revanche, l'option --cut-dirs
peut se révéler
utile si l'on souhaite garder des informations structurelles sur l'organisation
des dossiers si elle est pertinente, par exemple si les fichiers sont triés par
date.
Pour ignorer certains fichiers, il est aussi possible d'utiliser d'option
--reject
/-R
, qui accepte également les expressions régulières (tout comme
--accept
/-A
), dont le type peut-être précisé à l'aide de l'option
--regex-type
.
Créer un miroir pour un site
Une autre utilisation utile de wget
est de faire une copie locale d'un site
web. Pour ce faire, la commande longe est :
wget --mirror --no-host-directories --convert-links --adjust-extension --page-requisites --no-parent <url>
Le nom des options est assez claire, et la version courte serait : wget -mkEp -np <url>
Ignorer robots.txt
Il arrive parfois que le fichier robots.txt
interdise l'accès à certaines ressources. Pour l'ignorer, il suffit de rajouter d'option -e robots=off
.
Nombre d'essai
IL se peut que le serveur soit saturé et nous demande d'attendre pour quelques
ressources. Lorsque cela arrive, wget
va essayer à de nombreuses reprises (20
fois par défaut) de récupérer ladite ressource, ce qui peut ralentir la
récupération des données lors d'un miroir, surtout si le délai d’attente maximal
est élevé. Il est possible de réduire le nombre d'essai avec l'option
--tries
/-t
.
Détection de liens morts
Il est possible d'utilise l'option --spider
pour ne pas télécharger les
fichiers mais simplement sauter de liens en liens (comme une araignée sur sa
toile).
Cette fonctionnalité peut ainsi être exploitée pour débogguer son site web en
récupérant le résultat de cette recherche via l'option --output-file
/-o
.
wget --spider -r -nd -o <logfile> <url>
La liste des liens morts se retrouvera à la fin du fichier d’historique.
curl
Envoyer une requête POST
Un de mes cas d'usage les plus courants, pour communiquer avec des APIs par
exemple, est l'envoie de requêtes POST faites à la main avec amour. La syntaxe
est assez simple dans ce cas, il suffit d'envoyer ce que l'on souhaite à
l'option --form``-F
.
curl -F <champ1>=<contenu1> -F <champ2>=<contenu2> <url>
On peut aussi signaler qu'il est possible d'envoyer un fichier en précédent le
nom de fichier par une arobase @
:
curl -F photo=@ma_gueule_en_4k.jpg <url>