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 binairewget
(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 :
- L’URL est résolue en adresse IP du serveur.
wget
se connecte au serveur via une requête HTTP vers la ressource spécifiée.- Le code d’état de la réponse HTTP reçue par le serveur est 200.
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 :
- Lorsque vous téléchargez un fichier en utilisant l’option –timestamping ou -N,
wget
récupère l’horodatage du fichier distant. - Il vérifie l’horodatage du fichier local (s’il existe) et le compare à celui du fichier distant.
- 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.
Aucune carte de crédit requise