Comment utiliser wget avec Python pour télécharger des pages web et des fichiers

Ce guide complet présente wget, un puissant outil en ligne de commande pour télécharger des fichiers via HTTP, HTTPS et FTP, en le comparant favorablement à la bibliothèque requests de Python.
16 min de lecture
Illustration of wget usage with Python

Dans ce guide, nous allons aborder les points suivants :

  • Qu’est-ce que wget ?
  • Pourquoi il peut être meilleur que la bibliothèque requests.
  • La facilité d’utilisation de wget avec Python.
  • Les avantages et inconvénients de son adoption dans les scripts Python.

Alors, c’est parti !

Qu’est-ce que wget ?

wget est un utilitaire en ligne de commande pour télécharger des fichiers depuis le web en utilisant HTTP, HTTPS, FTP, FTPS, et d’autres protocoles internet. Il est nativement installé dans la plupart des systèmes d’exploitation de type Unix, mais il est également disponible pour Windows.

Pourquoi wget et pas un paquetage Python comme requests ?

Bien sûr, wget est un outil en ligne de commande sympa, mais pourquoi est-il préférable de l’utiliser pour télécharger des fichiers en Python plutôt qu’une bibliothèque populaire comme requests ?

Eh bien, il existe plusieurs raisons convaincantes d’utiliser wget plutôt que requests :

  • wget prend en charge beaucoup plus de protocoles que requests
  • wget peut reprendre les téléchargements interrompus
  • Avec wget, il est possible de spécifier la vitesse de téléchargement afin de ne pas consommer toute la bande passante du réseau
  • wget prend en charge les noms de fichiers et d’emplacements réseau comportant des caractères-jokers
  • wget utilise des fichiers de messages basés sur NLS pour de nombreuses langues
  • wget peut convertir les liens absolus des documents téléchargés en liens relatifs
  • wget prend en charge les proxys HTTP/S
  • wget prend en charge les connexions HTTP persistantes
  • wget peut effectuer des opérations de téléchargement sans surveillance (en arrière-plan)
  • wget utilise les horodatages des fichiers locaux pour déterminer si les documents doivent être téléchargés à nouveau lors de la mise en miroir
  • wget peut télécharger de manière récursive des fichiers liés à une page web spécifique ou jusqu’à ce qu’il atteigne une profondeur de récursivité spécifiée par l’utilisateur
  • wget respecte automatiquement les règles d’exclusion des robots définies dans le fichier robots.txt. Pour en savoir plus, consultez notre guide sur le fichier robots.txt pour le web scraping.

Ce ne sont là que quelques-unes des fonctionnalités de wget qui le rendent si puissant et si particulier par rapport à n’importe quelle bibliothèque client HTTP Python. Pour en savoir plus, consultez le manuel officiel.

En particulier, notez comment wget peut suivre les liens dans les pages HTML et télécharger les fichiers référencés dans ces pages. Cela vous permet de récupérer des sites web entiers. wget convient donc parfaitement au web crawling.

En bref, wget est une excellente option pour écrire des scripts conçus pour télécharger des fichiers et des pages web depuis le web. Voyons maintenant comment utiliser wget avec Python !

Exécution de commandes CLI en Python

Suivez les étapes ci-dessous et créez un script Python capable d’exécuter des commandes wget.

Prérequis

Avant de commencer, assurez-vous que wget est installé sur votre ordinateur. Le processus d’installation varie en fonction de votre système d’exploitation :

  • Sous Linux, il devrait déjà être installé. Sinon, installez-le à l’aide du gestionnaire de paquets de votre distribution.
  • Sur Mac, installez wget avec Homebrew.
  • Sous Windows, téléchargez le binaire wget pour Windows et placez-le dans un dossier. Ensuite, ajoutez le chemin d’accès au binaire wget (par exemple, C:\Program Files (x86)\Wget) à votre variable d’environnement PATH.

Python 3+ devra également être installé sur votre ordinateur. Pour l’installer, téléchargez le programme d’installation, double-cliquez dessus et suivez les instructions.

Une IDE Python telle que PyCharm Community Edition ou Visual Studio Code avec l’extension Python sera également utile.

Création d’un projet Python

Créez un projet Python wget avec un environnement virtuel en utilisant les commandes ci-dessous :

mkdir wget-python-demo

cd wget-python-demo

python -m venv env

Le répertoire wget-python-demo créé ci-dessus représente le dossier de votre projet.

Chargez-le dans votre IDE Python, créez un fichier script.py , et initialisez-le comme suit :

print('Hello, World!')

Pour l’instant, il s’agit juste d’un exemple de script qui affiche « Hello, World! » dans le terminal. Par la suite, il contiendra la logique d’intégration de wget.

Vérifiez que le script fonctionne en appuyant sur le bouton run de votre IDE ou en exécutant la commande ci-dessous :

python script.py

Dans le terminal, vous devriez voir :

Hello, World!

Excellent ! Vous avez maintenant un projet Python.

Dans la section suivant, nous allons voir comment utiliser wget !

Écrire une fonction pour exécuter des commandes CLI via le module Subprocess

La manière la plus simple d’exécuter des commandes CLI dans un script Python est d’utiliser le module subprocess .

Cette bibliothèque de la bibliothèque standard Python vous permet de créer de nouveaux processus, de vous connecter à leurs canaux d’entrée/sortie/erreur et d’obtenir leur code de retour. En d’autres termes, elle vous fournit tout le nécessaire pour exécuter des commandes sur le terminal en Python.

Voici comment vous pouvez utiliser la méthode Popen() à partir d’un sous-processus pour exécuter des commandes CLI comme wget avec Python :

import subprocess

def execute_command(command):

"""

Execute a CLI command and return the output and error messages.

Parameters:

- command (str): The CLI command to execute.

Returns:

- output (str): The output generated by the command.

- error (str): The error message generated by the command, if any.

"""

try:

# execute the command and capture the output and error messages

process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

output, error = process.communicate()

output = output.decode("utf-8")

error = error.decode("utf-8")

# return the output and error messages

return output, error

except Exception as e:

# if an exception occurs, return the exception message as an error

return None, str(e)

Popen() exécute la commande que vous avez passée sous forme de chaîne de caractères dans un nouveau processus de votre système d’exploitation. L’option « shell=True » garantit que la méthode utilisera le shell par défaut configuré dans votre système d’exploitation.

Collez l’extrait ci-dessus dans votre fichier script.py. Vous pouvez maintenant invoquer une commande CLI en Python, comme dans l’exemple suivant :

output, error = execute_command("<CLI command string>")

if error:

print("Une erreur s’est produite lors de l’exécution de la commande CLI :", error)

else:

print("Sortie de la commande CLI :", output)

Utilisation de wget avec Python : cas d’utilisation

Voici la syntaxe d’une commande wget :

wget [options] [url]

Où :

  • [options] est une liste d’options et de drapeaux supportés par l’outil CLI pour personnaliser son comportement.
  • url est l’URL du fichier que vous souhaitez télécharger. Il peut s’agir d’un lien direct vers un fichier ou de l’URL d’une page web contenant des liens vers plusieurs fichiers.

Remarque : sous Windows, écrivez wget.exe au lieu de wget.

Il est temps de voir wget en action dans plusieurs extraits Python couvrant des cas d’utilisation populaires !

Télécharger un fichier

Supposons que vous souhaitiez télécharger le site http://lumtest.com/myip.json avec wget. La commande pour y parvenir serait :

wget http://lumtest.com/myip.json

En Python, la ligne de code correspondante serait la suivante :

output, error = execute_command("wget http://lumtest.com/myip.json")

Si vous affichez la sortie, vous verrez quelque chose comme :

--2024-04-18 15:20:59-- http://lumtest.com/myip.json

Resolving lumtest.com (lumtest.com)... 3.94.72.89, 3.94.40.55

Connecting to lumtest.com (lumtest.com)|3.94.72.89|:80... connected.

HTTP request sent, awaiting response... 200 OK

Length: 266 [application/json]

Saving to: 'myip.json.1'

myip.json.1 100%[=================================================>] 266 --.-KB/s in 0s

2024-04-18 15:20:59 (5.41 MB/s) - 'myip.json.1' saved [266/266]

La sortie de la commande permet de constater ce qui suit :

  1. L’URL est résolue en adresse IP du serveur.
  2. wget se connecte au serveur via une requête HTTP vers la ressource spécifiée.
  3. Le code d’état de la réponse HTTP reçue par le serveur est 200.
  4. wget télécharge le fichier et le stocke dans le répertoire actuel.

Le répertoire de votre projet Python contient maintenant un fichier myip.json.

Si vous souhaitez modifier le dossier de destination du fichier à télécharger, utilisez l’option –directory-prefix ou -P comme indiqué ci-dessous :

output, error = execute_command("wget --directory-prefix=./download http://lumtest.com/myip.json")

Le fichier myip.json sera désormais stocké dans le dossier de téléchargement à l’intérieur du répertoire de votre projet. Notez que si le dossier de destination n’existe pas, wget le créera automatiquement.

Pour changer le nom de fichier de la ressource de téléchargement, utilisez l’option –output-document ou -O :

output, error = execute_command("wget --output-document=custom-name.json http://lumtest.com/myip.json")

Cette fois, le script Python wget créera un fichier nommé custom-name.json au lieu de myip.json.

Télécharger une page web

La commande wget est la même que précédemment, la principale différence étant que cette fois-ci, l’URL pointera vers une page web :

output, error = execute_command("wget https://brightdata.com/")

Le répertoire de votre projet contiendra désormais un fichier index.html contenant le contenu HTML de la page web à l’adresse https://brightdata.com/.

Télécharger un fichier uniquement s’il a été modifié depuis le dernier téléchargement

Pour économiser de l’espace disque et des ressources réseau, il se peut que vous ne souhaitiez pas télécharger un fichier s’il n’a pas été modifié depuis le dernier téléchargement. Voici pourquoi wget possède une fonction d’horodatage des fichiers.

En détail, l’option –timestamping demande à wget de comparer les horodatages des fichiers locaux avec ceux du serveur. Si le fichier local a un horodatage identique ou plus récent que celui du serveur, wget ne téléchargera pas le fichier à nouveau. Dans le cas contraire, il le téléchargera.

Voici comment fonctionne le mécanisme d’horodatage :

  1. Lorsque vous téléchargez un fichier en utilisant l’option –timestamping ou -N, wget récupère l’horodatage du fichier distant.
  2. Il vérifie l’horodatage du fichier local (s’il existe) et le compare à celui du fichier distant.
  3. Si le fichier local n’existe pas ou si son horodatage est plus ancien que celui du serveur, wget télécharge le fichier. Si le fichier local existe et que son horodatage est identique ou plus récent que celui du serveur, wget ne téléchargera pas le fichier.

L’horodatage dans HTTP est implémenté en vérifiant l’en-tête Last-Modified renvoyé par le serveur après une requête HEAD. wget examine également l’en-tête Content-Length pour comparer la taille des fichiers. Si les tailles sont différentes, le fichier distant sera téléchargé, quel que soit le contenu de l’en-tête Last-Modified. N’oubliez pas que Last-Modified est un en-tête de réponse facultatif. S’il n’est pas présent, wget téléchargera quand même le fichier.

Utilisez l’option –timestamping en Python avec la ligne de code suivante :

output, error = execute_command("wget --timestamping https://brightdata.com")

Si vous avez déjà téléchargé index.hml, vous obtiendrez le message ci-dessous indiquant que le fichier ne sera pas téléchargé à nouveau :

--2024-04-18 15:55:06-- https://brightdata.com

Resolving brightdata.com (brightdata.com)... 104.18.25.60, 104.18.24.60

Connecting to brightdata.com (brightdata.com)|104.18.25.60|:443... connected.

HTTP request sent, awaiting response... 304 Not Modified

File 'index.html' not modified on server. Omitting download.

Le même mécanisme fonctionne également lors du téléchargement de fichiers par FTP.

Reprendre les téléchargements interrompus

Par défaut, wget réessaie automatiquement de télécharger un fichier jusqu’à 20 fois si la connexion est perdue pendant le processus. Si vous souhaitez poursuivre manuellement un fichier partiellement téléchargé, utilisez l’option –continue ou -c comme suit :

output, error = execute_command("wget --continue http://lumtest.com/myip.json")

Télécharger un site complet

Le téléchargement récursif est une fonctionnalité de wget qui permet de télécharger un site en entier en une seule commande.

À partir de l’URL spécifiée, wget analyse la page HTML et suit les autres documents trouvés dans les attributs HTML src et href ou les attributs CSS url(). Si le fichier suivant est également un fichier texte/HTML, il l’analyse et suit également ses documents jusqu’à ce qu’il atteigne la profondeur souhaitée. Le téléchargement récursif suit un algorithme de recherche de type « breadth-first », récupérant les fichiers à la profondeur 1, puis à la profondeur 2, et ainsi de suite.

Les options de wget à prendre en compte lors de l’utilisation de ce mode de téléchargement sont les suivantes :

  • –recursive ou -r : indique à wget de télécharger les fichiers de manière récursive, ce qui signifie qu’il suivra les liens présents sur les pages web. Cela vous permet de créer des copies locales de sites web entiers, y compris toutes les ressources liées telles que les images, les feuilles de style, les scripts, etc. Lorsque cette option est spécifiée, wget stocke tous les fichiers téléchargés dans un dossier portant le même nom que le nom de domaine du site cible.
  • –level=<depth> ou -l=<depth> : spécifie la profondeur maximale de récursivité à suivre lors du téléchargement des pages liées. Par exemple, si vous définissez –level=1, wget ne téléchargera que les pages liées directement à l’URL de départ. Il ne suivra pas les liens de ces pages pour télécharger d’autres pages. Pour éviter l’exploration trop approfondie de sites volumineux, la valeur par défaut de la profondeur est de 5. Définissez cette option sur 0 ou “inf” pour une profondeur infinie. Si vous voulez vous assurer que toutes les ressources nécessaires à l’affichage correct d’une page sont téléchargées indépendamment de la profondeur spécifiée, ajoutez l’option -p ou –page-requisites.
  • –convert-links ou -k : modifie les liens dans les fichiers HTML téléchargés pour qu’ils pointent vers les fichiers téléchargés localement au lieu des URL d’origine. Cette option est utile lorsque vous souhaitez créer un miroir local d’un site et vous assurer que tous les liens des pages téléchargées fonctionnent correctement hors ligne.

Supposons que vous souhaitiez télécharger de manière récursive le site de Bright Data avec une profondeur maximale de 1 tout en convertissant tous les liens pour qu’ils pointent vers des fichiers locaux. Voici l’instruction Python wget que vous devez écrire :

output, error = execute_command("wget --recursive --level=1 --convert-links https://brightdata.com")

Remarque : l’exécution de cette commande peut durer un certain temps en fonction de la vitesse de votre connexion internet. Vous devrez donc faire preuve de patience.

Le répertoire brightdata.com contiendra alors une copie locale des fichiers du site de Bright Data avec un niveau de récursivité de 1.

Avantages et inconvénients de l’utilisation de wget avec Python

Voici les avantages et les inconvénients de l’utilisation de wget avec Python :

 Avantages

  • Intégration facile de Python grâce au module subprocess
  • De très nombreuses fonctionnalités et options, y compris le téléchargement récursif, les retentatives automatiques, l’horodatage des fichiers, etc.
  • wget peut faire une copie locale d’un site complet avec une seule commande
  • wget prend en charge le FTP
  • wget prend en charge l’intégration de proxies
  • wget est capable de reprendre les téléchargements interrompus

 Inconvénients

  • La sortie est constituée de fichiers téléchargés et non de variables de type chaîne de caractères que l’on pourrait utiliser directement dans le script Python
  • Vous avez besoin d’un analyseur comme Beautiful Soup pour accéder aux éléments DOM spécifiques des fichiers HTML téléchargés

[Extra] Utiliser wget avec un proxy

La principale difficulté liée à l’utilisation de wget pour télécharger un fichier ou un site complet réside dans le fait que vos requêtes peuvent être bloquées. En effet, les requêtes wget apparaîtront aux serveurs de destination comme provenant d’un robot. Pour surmonter les blocages, certains sites web mettent en place des restrictions et des limitations pour leurs pages et leurs ressources. Ces limitations peuvent inclure des restrictions géographiques, des politiques de limitation de débit ou des mesures anti-scraping.

L’utilisation conjointe d’un serveur proxy avec wget est une solution viable pour contourner ces restrictions. Un proxy agit comme un intermédiaire entre l’ordinateur et internet. En faisant passer le trafic wget par un serveur proxy, vous pouvez éviter d’exposer votre IP et contourner la plupart des limitations imposées par les sites.

Si vous cherchez un tutoriel plus complet, consultez notre guide sur l’utilisation d’un proxy avec wget.

Conclusion

Dans cet article, vous avez compris ce qu’est wget, pourquoi il certainement meilleur que la bibliothèque requests et comment l’utiliser en Python. Vous savez maintenant que wget est un outil puissant pour télécharger des fichiers et des pages web via HTTP, HTTPS et FTP. Grâce à ce que vous avez appris ici, vous savez comment utiliser wget avec Python.

Comme nous l’avons vu dans ce guide, un proxy peut être un grand allié pour éviter toutes les mesures anti-bots intégrées par les sites pour empêcher des utilitaires comme wget de télécharger leur contenu. La difficulté est qu’il existe des dizaines de fournisseurs de proxies en ligne et qu’il n’est pas facile de choisir le meilleur. Gagnez du temps en utilisant directement le meilleur du marché : Bright Data !

Bright Data contrôle les meilleurs serveurs proxy au monde, est au service d’entreprises du Fortune 500 et de plus de 20 000 clients. Son offre comprend un large éventail de types de proxies :

  • Proxies de centre de données : plus de 770 000 adresses IP de centre de données.
  • Proxies résidentiels : plus de 72 millions d’adresses IP résidentielles dans plus de 195 pays.
  • Proxies de FAI : plus de 700 000 adresses IP de FAI.
  • Proxies de mobiles : plus de 7 millions d’adresses IP mobiles.

Commencez par un essai gratuit ou entrez en contact avec l’un de nos experts en données de nos solutions de proxy et de scraping.