Python >> Tutoriel Python >  >> Python

Comment télécharger un fichier en Python

Saviez-vous que vous pouvez télécharger un fichier par programmation en Python ? Je vais vous montrer comment récupérer et enregistrer un fichier en Python. Ce processus est connu sous le nom de web scraping et constitue une étape essentielle de tout projet lié aux données.

Le scraping Web est le processus de collecte de données à partir d'un site Web. Bien que cela puisse être fait manuellement par un utilisateur, il s'agit généralement d'une méthode automatisée de collecte de données à l'aide d'un robot d'exploration Web.

Vous pouvez faire tout cela par programmation en Python. À la fin de cet article, vous saurez comment télécharger tout type de fichier en Python, y compris des PDF, des images, des vidéos et des pages. Le processus est similaire entre les différents types de fichiers.

Pour tirer le meilleur parti de cet article, il est bon d'avoir une compréhension de base de la programmation en Python. De plus, pour gagner du temps et accélérer votre apprentissage, je vous encourage à consulter notre piste de programmation Python.

Pour télécharger un fichier en Python, nous devons le récupérer et le sauvegarder. Ce processus peut être effectué en appelant une API ou simplement avec une URL Web normale pointant vers un GIF que vous aimez.

Avant d'aller plus loin, comprenons les API REST. Une API REST est un service qui vous permet d'accéder et de manipuler des données telles que des fichiers texte, des images, des services et des collections d'autres ressources sur un serveur via des mécanismes REST. Une API permet d'améliorer la portabilité des applications clientes et facilite le processus d'évolution des différents composants d'un produit. Ces API renvoient généralement des objets JSON encodés en UTF-8 en tant que ressource.

Il y a deux étapes fondamentales pour faire une demande lorsque vous travaillez avec des API REST. Tout d'abord, le client accède à un emplacement spécifique sur une API REST et indique la méthode à exécuter. C'est ce qu'on appelle une demande . Deuxièmement, le serveur exécute la méthode et renvoie les données au client. C'est ce qu'on appelle une réponse .

L'authentification est un élément essentiel de la sécurité Internet. Toute API REST qui permet aux clients d'accéder ou de modifier des données sensibles ou critiques doit disposer d'un système d'authentification. Même si l'API est gratuite, le propriétaire peut introduire une authentification pour limiter le nombre de requêtes par utilisateur.

Pour ce tutoriel, nous allons récupérer et enregistrer des fichiers en Python depuis place.dog et randomfox.ca. Aucune authentification n'est requise, vous pouvez donc réutiliser les extraits de code pour télécharger un fichier en Python. Vous pouvez trouver une liste des API publiques ici.

Tout d'abord, nous allons télécharger un fichier en Python via HTTP. Plus tard, nous téléchargerons un fichier en Python depuis une API. Allons droit au but !

Télécharger un fichier en Python via HTTP

Dans notre premier exemple, nous allons récupérer et enregistrer une photo d'un chien. Ce site Web propose des images aléatoires de chiens que vous pouvez utiliser comme espaces réservés pour votre prochain projet. Si vous actualisez la page, cela génère une autre image de chien.

Nous utiliserons la bibliothèque de requêtes, ce qui rend les requêtes HTTP plus simples que l'utilisation du urllib intégré bibliothèque. Vous devrez peut-être installer le requests bibliothèque avec la commande suivante :

pip install requests

Ensuite, nous importons requests , définissez le url variable avec notre URL cible, écrivez un GET demande et vérifier son statut. Voici les différents types de statut de réponse auxquels vous pouvez être confronté lors de la rédaction d'un GET requête :

  • 1xx Informationnel . Cela indique qu'une demande a été reçue et que le client doit continuer à faire des demandes pour la charge utile de données.
  • 2xx réussi . Il indique qu'une action demandée a été reçue, comprise et acceptée. Cela vous aide à vérifier que les données existent avant de travailler dessus.
  • Redirection 3xx . Cela indique que le client doit prendre des mesures supplémentaires pour traiter la demande, comme utiliser un proxy ou un point de terminaison différent pour accéder aux ressources.
  • Erreur client 4xx . Il indique des problèmes avec le client, par exemple, des méthodes non autorisées, des problèmes d'autorisation, un accès interdit ou des tentatives d'accès à des ressources qui n'existent pas.
  • Erreur de serveur 5xx . Cela indique des problèmes avec le serveur fournissant l'API.

Écrivons une requête pour récupérer un fichier en Python.

>>> import requests

>>> url = 'https://place.dog/300/200'

>>> # fetch file
>>> response = requests.get(url, allow_redirects=True)

>>> # Get response status
>>> response.status_code
200

Le 200 Le code d'état indique que la demande a abouti et que les données existent. De là, nous passons à l'étape suivante et enregistrons un fichier en Python à l'aide du write() méthode.

The 200 status code indicates the request is successful and the data exists. From there, we continue to the next step and save a file in Python with the help of the write() method.

Maintenant, le fichier a été enregistré sous dog1.jpg et contient une image d'un chien.

Pour un bon rappel sur la méthode write() pour enregistrer un fichier en Python, consultez mon article sur la façon d'écrire dans un fichier en Python ici.

Télécharger un fichier en Python à partir d'une API

Voyons maintenant comment récupérer et enregistrer un fichier dans Python en appelant une API et en analysant le fichier JSON. Contrairement à ce que nous avons fait précédemment, nous allons enregistrer le fichier avec pathlib.

La plupart des données disponibles en ligne sont au format JSON (JavaScript Object Notation). Il est utilisé pour stocker des informations dans des bases de données et est le type de données le plus courant que vous trouverez lorsque vous travaillez avec des API REST modernes. Les structures de données JSON peuvent être des paires nom-valeur non ordonnées , tels que des dictionnaires, des tables de hachage, des objets ou des listes à clés selon le langage de programmation, ou une liste ordonnée de valeurs tels que des tableaux, des listes et des vecteurs.

JSON peut être difficile à lire et à utiliser directement pour les humains. Python a différentes bibliothèques pour nous aider à lire les données JSON récupérées sur le Web pour résoudre ce problème. Parmi eux se trouve la bibliothèque JSON avec prise en charge intégrée pour la conversion des composants JSON en objets Python natifs. Le tableau suivant montre le mappage de conversion entre JSON et Python :

JSON Python objectdictionary arrayList ou tuple stringstring numberInteger ou float trueTrue falseFalse nullNone

Vous devez souvent gérer les données JSON lorsque vous travaillez avec des API REST. Vous pouvez trouver plus d'informations sur JSON dans notre cours sur Comment lire et écrire des fichiers JSON en Python.

Le requests la bibliothèque a de nombreuses fonctionnalités, mais nous n'avons besoin que du GET demande et le json() formateur pour l'exemple suivant. Comme nous l'avons fait précédemment, la première étape consiste à importer la bibliothèque de requêtes. Ensuite, nous créons un GET demande au point de terminaison de l'API auquel nous voulons accéder. L'API fournit un objet de réponse qui inclut les données JSON. Nous ne sommes intéressés que par les données JSON, qui sont renvoyées avec le json() module.

>>> import requests

>>> url = "https://randomfox.ca/floof"

>>> # fetch file
>>> response = requests.get(url, allow_redirects=True)

>>> # get json data
>>> json = response.json()
>>> print(json)
{'image': 'https://randomfox.ca/images/2.jpg', 'link': 'https://randomfox.ca/?i=2'}

Le json la sortie est similaire à un dictionnaire Python. Nous extrayons l'URL de l'image comme suit :

>>> img = json['image']
>>> print(img)
https://randomfox.ca/images/2.jpg

Ensuite, nous voulons enregistrer l'image. Comme mentionné précédemment, nous utilisons pathlib , un framework orienté objet pour gérer les chemins du système de fichiers. L'un de ses avantages est sa meilleure portabilité entre les systèmes d'exploitation. Vous pouvez trouver plus d'informations sur pathlib dans mon article sur comment renommer des fichiers.

Pour enregistrer l'image de notre renard, nous allons utiliser la méthode Path.write_bytes(data) pour ouvrir le chemin en mode binaire/octets et y écrire des données.

>>> # import Path class from pathlib
>>> from pathlib import Path

>>> # define filename
>>> filename = Path('fox.jpg')

>>> # fetch file
>>> response = requests.get(img)

>>> # save file
>>> filename.write_bytes(response.content)

Notre fichier a maintenant été enregistré sous fox.jpg . Nous venons de voir comment extraire l'URL dans la réponse de l'API en inspectant le json données.

Réflexions finales sur la façon de télécharger un fichier en Python

Nous avons maintenant appris à télécharger un fichier en Python via HTTP et depuis une API. Je vous encourage à jouer avec le code et à récupérer des fichiers à partir de différentes API.

Il y a beaucoup plus à apprendre sur JSON, qui est un format répandu et pratique pour stocker des données. Vous pouvez en savoir plus à ce sujet et sur la programmation Python avec notre piste de programmation Python.

Enfin, c'est toujours une bonne idée de réfléchir à vos compétences en programmation Python. Pour vous aider dans ce processus, consultez mon article sur les choses qui peuvent vous aider à écrire un meilleur code Python et parcourez notre contenu sur LearnPython.com. Continuez à apprendre tous les jours !