129 lines
5.3 KiB
Markdown
129 lines
5.3 KiB
Markdown
---
|
||
Title: wget/curl
|
||
Date: 2022-07-25 13:45 CEST
|
||
Author: Fabrice
|
||
Category: cheat sheets
|
||
Tags: wget, curl, cli
|
||
Slug: wget-curl
|
||
Header_Cover: ../images/covers/speedboat.jpg
|
||
Summary: Quelques commandes wget et curl utiles dans la vie de tous les jours.
|
||
Lang: fr
|
||
---
|
||
|
||
`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](https://www.gnu.org/software/wget/manual/wget.html) 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](https://curl.haxx.se/docs/manpage.html) 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](https://en.wikipedia.org/wiki/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](https://degooglisons-internet.org/).
|
||
|
||
# wget
|
||
|
||
## Télécharger un dossier
|
||
|
||
Pour télécharger un dossier spécifique:
|
||
```sh
|
||
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:
|
||
```sh
|
||
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 :
|
||
```sh
|
||
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`](https://en.wikipedia.org/wiki/Robots_exclusion_standard) 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`.
|
||
|
||
```sh
|
||
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`.
|
||
|
||
```sh
|
||
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 `@`:
|
||
```sh
|
||
curl -F photo=@ma_gueule_en_4k.jpg <url>
|
||
```
|
||
|
||
<!-- spl=fr
|
||
-->
|