wget/curl

Posté par Fabrice le lundi 25 juillet 2022 Traduction : en

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>

<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>

tags: wget, curl, cli