Fermer

septembre 26, 2022

Guide du débutant sur les requêtes HTTP Python


Tout est accessible sur le Web via des requêtes. Si vous avez besoin d’informations à partir d’une page Web dans votre application Python, vous avez besoin d’une requête Web. Dans cet article, nous allons approfondir les requêtes Python. Nous verrons comment une requête Web est structurée et comment faire une requête Python. À la fin, vous pourrez utiliser la bibliothèque de requêtes Python, ce qui facilite l’ensemble du processus.

Une introduction aux requêtes HTTP

Pour échanger des données sur le Web, nous avons d’abord besoin d’un protocole de communication. Le protocole utilisé lorsque nous naviguons sur le Web est le protocole de transfert hypertexte, ou HTTP. HTTP utilise TCP comme protocole de transport, car il a besoin d’un transport fiable, et seul TCP peut le garantir.

Disons qu’il y a une ressource dont nous avons besoin – comme une page HTML, sur un serveur Web situé quelque part dans le monde. Nous voulons accéder à cette ressource ou, en d’autres termes, nous voulons consulter cette page dans notre navigateur Web. La première chose que nous devons faire est de faire une requête HTTP. HTTP est un protocole client-serveur, ce qui signifie que les requêtes sont initiées par le client.

Une fois que le serveur a reçu les demandes, il les traite et renvoie une réponse appropriée.

Le serveur peut répondre de différentes manières. Il peut envoyer la ressource que nous avons demandée ou répondre avec des codes d’état si quelque chose ne se passe pas comme prévu.

Dans chaque protocole de communication, les informations doivent se trouver dans des champs spécifiques. En effet, le client et le serveur doivent savoir comment interpréter la requête ou la réponse. Dans les sections suivantes, nous verrons comment une requête HTTP et une réponse HTTP sont construites. Nous aborderons également le rôle des champs les plus importants.

La requête HTTP

L’une des caractéristiques de conception les plus importantes de HTTP est qu’il est lisible par l’homme. Cela signifie que, lorsque nous examinons une requête HTTP, nous pouvons facilement tout lire, même s’il y a beaucoup de complexité sous le capot. Une autre caractéristique de HTTP est qu’il est apatride. Cela signifie qu’il n’y a pas de lien entre deux requêtes servies l’une après l’autre. Le protocole HTTP ne se souvient de rien de la requête précédente. Cela implique que chaque requête doit contenir tout ce dont le serveur a besoin pour exécuter la requête.

Une requête HTTP valide doit contenir les éléments suivants :

  • une méthode HTTP — telle que GET ou POST
  • la version du protocole HTTP
  • le chemin de la ressource à récupérer

Ensuite, nous pouvons également ajouter des en-têtes facultatifs qui spécifient des informations supplémentaires sur l’expéditeur ou le message. Un exemple d’en-tête de requête HTTP commun est le User-Agent ou la langue naturelle que le client préfère. Ces deux en-têtes facultatifs donnent des informations sur le client qui fait la demande.

Ceci est un exemple de message HTTP, et nous pouvons clairement comprendre tous les champs spécifiés :

~~~http
GET / HTTP/1.1
Host: www.google.com
Accept-Language: en-GB,en;q=0.5
~~~

La première ligne spécifie le type de requête et la version du protocole HTTP. Ensuite on précise le Host et la langue acceptée par le client qui envoie la requête. Habituellement, les messages sont beaucoup plus longs, mais cela donne une idée de ce à quoi ils ressemblent.

La réponse HTTP

Maintenant que nous avons une idée de ce à quoi ressemble une requête HTTP, nous pouvons continuer et voir la réponse HTTP.

Une réponse HTTP contient généralement les éléments suivants :

  • la version du protocole HTTP
  • un code d’état, avec un court message descriptif
  • une liste d’en-têtes HTTP
  • un corps de message contenant la ressource demandée

Maintenant que nous avons introduit les éléments de base dont vous avez besoin, cela vaut la peine de faire un résumé avant de passer à l’étape suivante. Il devrait être clair maintenant que, chaque fois qu’un client veut communiquer avec un serveur HTTP, il doit créer et envoyer une requête HTTP. Ensuite, lorsque le serveur le reçoit, il crée et envoie une réponse HTTP.

Nous sommes enfin prêts à présenter la bibliothèque de requêtes Python.

La bibliothèque de requêtes Python

Le Python bibliothèque de requêtes vous permet d’envoyer des requêtes HTTP Python – des plus simples aux plus complexes. La bibliothèque de requêtes Python résume les complexités de la création de requêtes Python complexes, fournissant une interface facile à utiliser. Dans les sections suivantes, nous verrons comment créer des requêtes Python simples et interpréter la réponse. Nous verrons également certaines des fonctionnalités fournies par la bibliothèque de requêtes Python.

Installation des requêtes Python

Tout d’abord, nous devons installer la bibliothèque de requêtes Python. Installons-le en utilisant pip:

$ pip install requests

Une fois la bibliothèque de requêtes Python correctement installée, nous pouvons commencer à l’utiliser.

Notre première requête GET avec des requêtes Python

La première chose que nous devons faire est de créer un fichier Python. Dans cet exemple, nous l’appelons web.py. Dans ce fichier source, insérez ce code :

import requests

URL = "https://www.google.com"
resp = requests.get(URL)

print(resp)

Ce programme effectue une requête GET pour Google. Si nous exécutons ce programme, nous obtiendrons probablement cette sortie :

$ python web.py
<Response [200]>

Qu’est-ce que cela signifie?

Nous avons parlé du code d’état plus tôt. Cette sortie nous indique que notre demande a été reçue, comprise et traitée avec succès. Il existe également d’autres codes, et nous pouvons énumérer quelques-uns des plus courants :

  • 301 Moved Permanently. Ceci est un message de redirection. L’URL de la ressource que nous recherchions a été déplacée. La nouvelle URL est fournie avec la réponse.

  • 401 Unauthorized. Ceci indique une réponse d’erreur client. Dans ce cas, le serveur nous dit que nous devons nous authentifier avant de procéder à la demande.

  • 404 Not found. Cela indique également une réponse d’erreur du client. Cela signifie notamment que le serveur ne trouve pas la ressource recherchée.

Que se passe-t-il si nous voulons vérifier l’état de manière conditionnelle et proposer différentes actions en fonction du code d’état ? Eh bien, nous pouvons facilement faire ceci:

import requests

URL = "https://www.google.com/blah"
resp = requests.get(URL)

if resp.status_code == 200:
  print("Okay, all good!")
elif resp.status_code == 301:
  print("Ops, the resource has been moved!")
elif resp.status_code == 404:
  print("Oh no, the resource wasn't found!")
else:
  print(resp.status_code)

Si nous exécutons le script maintenant, nous obtiendrons quelque chose de différent. Essayez et voyez ce que nous obtenons. 😉

Si nous voulons également le court message descriptif qui accompagne chaque code de statut, nous pouvons utiliser resp.reason. Dans le cas d’un code d’état 200, nous obtiendrons simplement OK.

Inspecter la réponse de la requête Python

À ce stade, nous savons comment faire une requête Python de base. Après la demande, nous voulons la réponse, n’est-ce pas ?

Dans la section précédente, nous avons vu comment obtenir le code d’état de la réponse. Maintenant, nous voulons lire le corps de la réponse, qui est la ressource réelle que nous avons demandée. Pour ce faire, nous devons utiliser resp.content. Disons que nous recherchons la page d’accueil de Google.

Voici ce que nous obtenons lorsque nous exécutons le script :

b'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en"><head><meta content="text/html; [...]

J’ai ajouté [...] ci-dessus parce que la ressource que nous obtenons – qui est un text/html document — est trop long pour être imprimé. De combien? On peut utiliser len(resp.content) pour obtenir ces informations. Dans le cas ci-dessus, il s’agissait de 13931 octets — définitivement trop pour être imprimés ici !

Utilisation des API

L’une des raisons pour lesquelles la bibliothèque de requêtes Python est devenue si populaire est qu’elle facilite l’interaction avec les API. Pour cet exemple, nous utiliserons une API simple pour prédire l’âge d’une personne, compte tenu de son nom. Cette API s’appelle Agifier.

Voici le code de l’exemple :

import requests
import json

URL = "https://api.agify.io/?name=Marcus"
resp = requests.get(URL)

if resp.status_code == 200:
  encoded = resp.json()
  print(encoded['age'])
else:
  print(resp.status_code)

Dans ce cas, nous voulons connaître l’âge d’une personne dont le nom est Marcus. Une fois que nous avons la réponse, si le code d’état est 200, nous interprétons le résultat en JSON en utilisant resp.json(). À ce stade, nous avons un objet semblable à un dictionnaire et nous pouvons imprimer l’âge estimé.

L’âge estimé de Marcus est 41 ans.

Les en-têtes HTTP fournissent des informations supplémentaires aux deux parties d’une conversation HTTP. Dans l’exemple suivant, nous verrons comment modifier les en-têtes d’une requête HTTP GET. En particulier, nous allons changer le User-Agent et le Accept-Language en-têtes. La User-Agent indique au serveur des informations sur l’application, le système d’exploitation et le fournisseur de l’agent demandeur. La Accept-Language header communique les langues que le client est capable de comprendre.

Voici notre simple extrait de code :

import requests

URL = "https://www.google.com"
custom_headers = {'Accept-Language': 'fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5', 'User-Agent': 'Mozilla/5.0 (Linux; Android 12; SM-S906N Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.119 Mobile Safari/537.36'}
resp = requests.get(URL, headers=custom_headers)

if resp.status_code == 200:
  
  print(resp.content[:100])  
else:
  print(resp.status_code)

Si tout se passe bien, vous devriez obtenir quelque chose comme ceci :

$ <!doctype html><html lang="fr"><head><meta charset="UTF-8"><meta content="width=device-width,mini [...]

Dans cet exemple, nous avons changé le User-Agent, prétendant que notre demande provient de Mozilla Firefox. Nous disons également que notre système d’exploitation est Android 12 et que notre appareil est un Samsung Galaxy S22.

Comme nous avons imprimé les 100 premiers caractères de la réponse ci-dessus, nous pouvons voir que la page HTML que nous avons reçue est en français.

Conclusion

Dans cet article, nous avons parlé du protocole HTTP, avec une brève introduction théorique. Ensuite, nous avons examiné la bibliothèque de requêtes Python. Nous avons vu comment écrire des requêtes HTTP Python de base et comment les personnaliser en fonction de nos besoins.

J’espère que vous trouverez cette bibliothèque et cet article utiles pour vos projets.

Lecture connexe :




Source link