Vous cherchez à récupérer des fichiers depuis une adresse web en utilisant Python ? Découvrons ensemble les différentes approches possibles.
Lors de vos projets Python, il est fréquent de devoir télécharger des données depuis internet, à partir d’une URL spécifique.
Bien qu’il soit possible de télécharger ces éléments manuellement, il est souvent plus efficace de les récupérer via un script Python, automatisant ainsi le processus.
Ce tutoriel vous présentera les différentes méthodes pour télécharger des fichiers à l’aide de Python, en utilisant aussi bien les modules natifs que des bibliothèques externes.
Comment utiliser Python pour le téléchargement de fichiers à partir d’une URL
Si vous êtes familier avec Python, vous avez probablement croisé cette célèbre bande dessinée XKCD :
Bande dessinée Python | Source: XKCD
Pour illustrer nos propos, nous allons tenter de télécharger cette image PNG (extension .png) de la bande dessinée XKCD dans notre répertoire de travail, en utilisant diverses méthodes.
Dans ce tutoriel, nous utiliserons plusieurs bibliothèques Python tierces. Veillez à les installer dans un environnement virtuel dédié à votre projet.
Utilisation de urllib.request
Le module intégré urllib.request permet de télécharger des fichiers à partir d’une URL. Ce module fournit des fonctionnalités pour exécuter des requêtes HTTP et gérer les URLs. Il offre une méthode simple pour interagir avec les ressources web, en supportant des opérations telles que la récupération de données depuis des sites internet.
Voici comment télécharger la bande dessinée XKCD Python en utilisant urllib.request :
import urllib.request url="https://imgs.xkcd.com/comics/python.png" urllib.request.urlretrieve(url, 'xkcd_comic.png')
Voici les étapes que nous avons suivies :
- Importer le module urllib.request.
- Définir l’URL de l’image de la bande dessinée XKCD Python.
- Utiliser `urllib.request.urlretrieve` pour télécharger l’image et l’enregistrer sous le nom « xkcd_comic.png » dans le répertoire courant.
Si vous exécutez maintenant la commande `ls` dans votre terminal, vous devriez voir le fichier « xkcd_comic.png » :
Utilisation de la bibliothèque requests
La bibliothèque requests est une bibliothèque Python populaire et largement utilisée pour l’envoi de requêtes HTTP et la récupération de contenu web.
Pour commencer, installez la bibliothèque requests :
pip install requests
Si vous avez créé un nouveau script Python dans le même répertoire, supprimez « xkcd_comic.png » avant d’exécuter le script actuel.
import requests url="https://imgs.xkcd.com/comics/python.png" response = requests.get(url) with open('xkcd_comic.png', 'wb') as file: file.write(response.content)
Voici l’explication de cette approche :
- Importer la bibliothèque `requests`.
- Définir l’URL de l’image de la bande dessinée XKCD Python.
- Envoyer une requête `GET` à l’URL à l’aide de `requests.get`.
- Enregistrer le contenu de la réponse (les données de l’image) sous le nom « xkcd_comic.png » en mode écriture binaire.
Vous devriez voir l’image téléchargée dans le contenu de votre répertoire :
Utilisation de urllib3
Nous avons vu comment utiliser le module `urllib.request`. Il existe une autre option, la bibliothèque tierce `urllib3`.
urllib3 est une bibliothèque Python conçue pour exécuter des requêtes HTTP et gérer les connexions de manière plus fiable et efficace que le module `urllib` natif. Elle offre des fonctionnalités telles que le regroupement de connexions, les tentatives de requêtes et la sécurité des threads, ce qui en fait un outil robuste pour la gestion des communications HTTP dans les applications Python.
Installez `urllib3` avec pip :
pip install urllib3
Téléchargeons maintenant la bande dessinée XKCD Python en utilisant la bibliothèque `urllib3` :
import urllib3 # URL de l'image de la bande dessinée XKCD url="https://imgs.xkcd.com/comics/python.png" # Créer une instance de PoolManager http = urllib3.PoolManager() # Envoyer une requête HTTP GET à l'URL response = http.request('GET', url) # Récupérer le contenu (données de l'image) image_data = response.data # Définir le nom de fichier sous lequel enregistrer la bande dessinée file_name="xkcd_comic.png" # Enregistrer les données de l'image with open(file_name, 'wb') as file: file.write(image_data)
Cette approche semble plus complexe que les précédentes. Décortiquons les différentes étapes :
- Nous importons d’abord le module `urllib3`.
- Nous définissons l’URL de l’image de la bande dessinée XKCD.
- Nous créons une instance de `urllib3.PoolManager()`. Cet objet gère le pool de connexions et permet d’envoyer des requêtes HTTP.
- Nous utilisons ensuite la méthode `http.request(‘GET’, url)` pour envoyer une requête HTTP GET à l’URL spécifiée, ce qui permet de récupérer le contenu de la bande dessinée XKCD.
- Une fois la requête réussie, nous récupérons le contenu (les données de l’image) de la réponse HTTP à l’aide de `response.data`.
- Enfin, nous écrivons les données de l’image (récupérées de la réponse) dans le fichier.
Lorsque vous exécutez votre script Python, vous devriez obtenir le résultat suivant :
Utilisation de wget
La bibliothèque Python wget facilite le téléchargement de fichiers à partir d’URL. Vous pouvez l’utiliser pour récupérer des ressources web et elle est particulièrement utile pour automatiser les tâches de téléchargement.
Installez la bibliothèque `wget` à l’aide de pip, puis utilisez ses fonctions pour télécharger des fichiers à partir d’URL :
pip install wget
Cet extrait utilise le module `wget` pour télécharger la bande dessinée XKCD Python et l’enregistrer sous le nom « xkcd_comic.png » dans le répertoire de travail :
import wget url="https://imgs.xkcd.com/comics/python.png" wget.download(url, 'xkcd_comic.png')
Ici :
- Nous importons le module `wget`.
- Définissons l’URL de l’image de la bande dessinée XKCD Python.
- Utilisons `wget.download` pour télécharger l’image et l’enregistrer sous le nom « xkcd_comic.png » dans le répertoire courant.
Lorsque vous téléchargez la bande dessinée XKCD à l’aide de `wget`, vous devriez obtenir un résultat similaire :
Utilisation de PyCURL
Si vous avez déjà utilisé une machine Linux ou un Mac, vous connaissez peut-être l’outil de ligne de commande `cURL`, qui permet de télécharger des fichiers depuis le web.
PyCURL, une interface Python pour `libcurl`, est un outil puissant pour exécuter des requêtes HTTP. Il offre un contrôle précis sur les requêtes et vous pouvez l’utiliser pour des cas d’utilisation avancés lors de la gestion des ressources web.
L’installation de `pycurl` dans votre environnement de travail peut être complexe. Essayez d’installer en utilisant pip :
pip install pycurl
⚠️ Si vous rencontrez des erreurs durant l’installation, vous pouvez consulter le Guide d’installation de PyCURL pour obtenir des conseils de dépannage.
Alternativement, si `cURL` est installé, vous pouvez installer les liaisons Python pour `libcurl` comme ceci :
sudo apt install python3-pycurl
Note : Avant d’installer les liaisons Python, vous devez avoir installé `cURL`. Si `cURL` n’est pas installé sur votre machine, vous pouvez le faire comme ceci : `apt install curl`.
Téléchargement de fichiers avec PyCURL
Voici le code pour télécharger la bande dessinée XKCD à l’aide de `PyCURL` :
import pycurl from io import BytesIO # URL de la bande dessinée XKCD Python url="https://imgs.xkcd.com/comics/python.png" # Créer un objet Curl c = pycurl.Curl() # Définir l'URL c.setopt(pycurl.URL, url) # Créer un objet BytesIO pour stocker les données téléchargées buffer = BytesIO() c.setopt(pycurl.WRITEDATA, buffer) # Exécuter la requête c.perform() # Vérifier si la requête a réussi (code d'état HTTP 200) http_code = c.getinfo(pycurl.HTTP_CODE) if http_code == 200: # Enregistrer les données téléchargées dans un fichier with open('xkcd_comic.png', 'wb') as f: f.write(buffer.getvalue()) # Fermer l'objet Curl c.close()
Décomposons ce code en sections plus petites pour chaque étape :
Étape 1 : Importer les modules nécessaires
Nous importons d’abord `pycurl` pour pouvoir l’utiliser afin d’effectuer des requêtes HTTP. Ensuite, nous importons `BytesIO` du module d’entrée-sortie afin de créer un tampon pour stocker les données téléchargées :
import pycurl from io import BytesIO
Étape 2 : Créer un objet Curl et définir l’URL
Nous spécifions l’URL de la bande dessinée XKCD Python que nous souhaitons télécharger et créons un objet `curl`, qui représente la requête HTTP. Ensuite, nous définissons l’URL de l’objet `Curl` en utilisant `c.setopt(pycurl.URL, url)` :
# URL de la bande dessinée XKCD Python url="https://imgs.xkcd.com/comics/python.png" # Créer un objet Curl c = pycurl.Curl() # Définir l'URL c.setopt(pycurl.URL, url)
Étape 3 : Créer un objet BytesIO et définir l’option WRITEDATA
Nous créons un objet `BytesIO` pour stocker les données téléchargées et configurons l’objet `Curl` pour écrire les données de réponse dans notre tampon en utilisant `c.setopt(pycurl.WRITEDATA, buffer)` :
# Créer un objet BytesIO pour stocker les données téléchargées buffer = BytesIO() c.setopt(pycurl.WRITEDATA, buffer)
Étape 4 : Exécuter la requête
Exécutez la requête HTTP en utilisant `c.perform()` pour récupérer les données de l’image de la bande dessinée :
# Exécuter la requête c.perform()
Étape 5 : Vérifier le code d’état HTTP et enregistrer les données téléchargées
Nous obtenons le code d’état HTTP en utilisant `c.getinfo(pycurl.HTTP_CODE)` pour garantir que la requête a réussi (code HTTP 200). Si le code d’état HTTP est 200, nous écrivons les données du tampon dans le fichier image :
# Vérifier si la requête a réussi (code d'état HTTP 200) http_code = c.getinfo(pycurl.HTTP_CODE) if http_code == 200: # Enregistrer les données téléchargées dans un fichier with open('xkcd_comic.png', 'wb') as f: f.write(buffer.getvalue())
Étape 6 : Fermer l’objet Curl
Enfin, nous fermons l’objet `curl` en utilisant `c.close()` afin de libérer les ressources :
# Fermer l'objet Curl c.close()
Comment télécharger des fichiers volumineux en petits morceaux
Jusqu’à présent, nous avons vu différentes méthodes pour télécharger la bande dessinée XKCD Python (un petit fichier image) dans le répertoire courant.
Cependant, il se peut que vous ayez besoin de télécharger des fichiers beaucoup plus volumineux, tels que des programmes d’installation pour des IDE, etc. Lors du téléchargement de fichiers volumineux, il est utile de les télécharger par petits morceaux et de suivre la progression du téléchargement. Nous pouvons utiliser la fonctionnalité de la bibliothèque `requests` pour cela.
Utilisons `requests` pour télécharger le programme d’installation de VS Code par morceaux de 1 Mo :
import requests # URL du fichier EXE d'installation de Visual Studio Code url="https://code.visualstudio.com/sha/download?build=stable&os=win32-x64-user" # Taille des morceaux pour le téléchargement chunk_size = 1024 * 1024 # morceaux de 1 Mo response = requests.get(url, stream=True) # Déterminer la taille totale du fichier à partir de l'en-tête Content-Length total_size = int(response.headers.get('content-length', 0)) with open('vs_code_installer.exe', 'wb') as file: for chunk in response.iter_content(chunk_size): if chunk: file.write(chunk) file_size = file.tell() # Obtenir la taille actuelle du fichier print(f'Téléchargement... {file_size}/{total_size} octets', end='\r') print('Téléchargement terminé.')
Ici :
- Nous définissons `chunk_size` pour déterminer la taille de chaque morceau (1 Mo dans cet exemple).
- Nous utilisons ensuite `requests.get` avec `stream=True` pour diffuser le contenu de la réponse sans charger l’intégralité du fichier en mémoire en une seule fois.
- Nous enregistrons chaque morceau dans le fichier de manière séquentielle au fur et à mesure de son téléchargement.
Pendant le téléchargement, vous verrez le nombre d’octets actuellement téléchargés et le nombre total d’octets :
Une fois le téléchargement terminé, vous devriez voir le message « Téléchargement terminé. » :
Et vous devriez voir le programme d’installation de VS Code dans votre répertoire :
Conclusion
J’espère que vous avez appris différentes méthodes pour télécharger des fichiers à partir d’URL en utilisant Python. En plus du module natif `urllib.request`, nous avons couvert les bibliothèques Python tierces populaires telles que `requests`, `urllib3`, `wget` et `PuCURL`.
En tant que développeur, j’ai eu tendance à utiliser la bibliothèque `requests` dans mes projets pour le téléchargement de fichiers et la communication avec des API web. Cependant, les autres méthodes peuvent également s’avérer utiles en fonction de la complexité de la tâche de téléchargement et du niveau de granularité dont vous avez besoin sur les requêtes HTTP. Bon téléchargement !