Gérer les requêtes HTTP avec Requests
Requests est une bibliothèque Python simple et puissante pour envoyer des requêtes HTTP. Elle permet d’interagir facilement avec des API ou de récupérer des données depuis des sites web. Grâce à sa syntaxe intuitive, Requests facilite l’envoi de requêtes HTTP de différents types (GET, POST, PUT, DELETE, etc.) et la gestion des réponses. Elle permet également de gérer les paramètres de requêtes, les en-têtes, l’authentification, et de télécharger des fichiers ou des données en JSON. Cette bibliothèque est largement utilisée pour effectuer des appels API, scraper des pages web statiques ou interagir avec des services web.
Fonctions :
-
requests.get()
La fonction requests.get() envoie une requête HTTP GET, qui est utilisée pour récupérer des ressources depuis un serveur, comme une page web ou des données d'une API.
Importation :
import requests
Attributs :
Paramètre Description url
URL à laquelle la requête GET est envoyée. params
Paramètres facultatifs sous forme de dictionnaire (optionnel). timeout
Durée maximale d'attente avant d'abandonner la requête (optionnel). headers
En-têtes HTTP personnalisés (optionnel). status_code
Code de statut HTTP renvoyé par le serveur. Exemple de code :
# Faire une requête GET url = 'https://www.example.com' response = requests.get(url) # Vérifier si la requête a réussi if response.status_code == 200: print("Requête réussie !") print(response.text) # Affiche le contenu de la page else: print(f"Erreur {response.status_code}")
-
requests.post()
La fonction requests.post() envoie une requête HTTP POST, souvent utilisée pour envoyer des données au serveur, comme des informations de formulaire ou des données JSON.
Importation :
import requests
Attributs :
Paramètre Description url
URL à laquelle la requête POST est envoyée. data
Données à envoyer dans le corps de la requête (sous forme de dictionnaire). json
Données à envoyer au format JSON (optionnel). timeout
Durée d'attente en secondes avant l'expiration (optionnel). Exemple de code :
# Faire une requête POST url = 'https://www.example.com/login' data = {'username': 'user', 'password': 'pass'} response = requests.post(url, data=data) # Vérifier la réponse if response.status_code == 200: print("Connexion réussie !") else: print(f"Erreur {response.status_code}")
-
requests.head()
La fonction requests.head() envoie une requête HTTP HEAD, qui est similaire à GET, mais elle ne récupère que les en-têtes de la réponse et pas le corps.
Importation :
import requests
Attributs :
Paramètre Description url
URL de la page dont on souhaite récupérer les en-têtes. headers
Dictionnaire des en-têtes de la réponse (par exemple, type de contenu, date, etc.). Exemple de code :
# Faire une requête HEAD pour obtenir seulement les en-têtes url = 'https://www.example.com' response = requests.head(url) # Afficher les en-têtes de la réponse print(response.headers)
-
requests.put()
La fonction requests.put() envoie une requête HTTP PUT, souvent utilisée pour mettre à jour une ressource existante sur un serveur.
Importation :
import requests
Attributs :
Paramètre Description url
URL de l'API ou de la ressource à mettre à jour. data
Données à envoyer dans le corps de la requête (sous forme de dictionnaire). Exemple de code :
# Faire une requête PUT url = 'https://api.example.com/update' data = {'id': 123, 'status': 'active'} response = requests.put(url, data=data) # Vérifier la réponse if response.status_code == 200: print("Données mises à jour avec succès !") else: print(f"Erreur {response.status_code}")
-
requests.delete()
La fonction requests.delete() envoie une requête HTTP DELETE pour supprimer une ressource existante sur un serveur.
Importation :
import requests
Attributs :
Paramètre Description url
URL de la ressource à supprimer. Exemple de code :
# Faire une requête DELETE url = 'https://api.example.com/delete/123' response = requests.delete(url) # Vérifier la réponse if response.status_code == 200: print("Ressource supprimée avec succès !") else: print(f"Erreur {response.status_code}")
-
requests.Session()
Utiliser une session (requests.Session) permet de maintenir certaines informations de la requête, comme les cookies et les en-têtes, entre les requêtes. Cela peut simuler un comportement plus naturel en gardant une "session" active, ce qui peut éviter les blocages.
Exemple de code :
import requests # Créer une session session = requests.Session() # Ajouter un user-agent personnalisé pour la session session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' }) # Faire une requête GET avec la session url = 'https://www.example.com' response = session.get(url) # Vérifier la réponse if response.status_code == 200: print("Requête réussie avec session !") else: print(f"Erreur {response.status_code}")
Explication du code :
La
Session
conserve l'état des connexions, y compris les cookies et les en-têtes. Cela permet d'effectuer plusieurs requêtes sans avoir à redéfinir manuellement les headers et cookies à chaque fois. Le code montre comment configurer unuser-agent
personnalisé pour la session et comment envoyer une requête GET en utilisant cette session. -
Gestion des cookies
Les cookies peuvent être utilisés pour maintenir l'état entre les requêtes. Si un site exige une forme d'authentification ou de suivi, les cookies permettent de simuler une session valide et d'éviter les blocages.
Exemple de code :
import requests # Créer une session session = requests.Session() # Faire une première requête pour récupérer les cookies url = 'https://www.example.com/login' response = session.get(url) # Utiliser les cookies récupérés pour une autre requête data = {'username': 'user', 'password': 'pass'} response = session.post(url, data=data) # Vérifier la réponse if response.status_code == 200: print("Connexion réussie avec cookies !") else: print(f"Erreur {response.status_code}")
Explication du code :
La session est utilisée pour maintenir les cookies entre les requêtes. Après une première requête pour récupérer les cookies (par exemple, une page de connexion), nous utilisons ces cookies pour effectuer une autre requête (comme un
POST
pour se connecter). -
Simulation de délais entre les requêtes
Pour éviter que votre activité ne soit perçue comme suspecte (scraping trop rapide), vous pouvez simuler des délais (comme un intervalle entre les requêtes).
Exemple de code :
import requests import time # Faire une requête avec délai simulé url = 'https://www.example.com' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'} # Faire une requête GET avec un délai entre les requêtes response = requests.get(url, headers=headers) time.sleep(3) # Délai de 3 secondes entre les requêtes # Vérifier la réponse if response.status_code == 200: print("Requête réussie avec délai !") else: print(f"Erreur {response.status_code}")
Explication du code :
Ici, après chaque requête, nous utilisons la fonction
time.sleep(3)
pour ajouter un délai de 3 secondes avant la prochaine requête. Cela imite mieux le comportement humain, qui prend généralement du temps entre les interactions, et réduit le risque d'être bloqué. -
Vérification de la réponse HTTP pour détecter les blocages
Il est important de vérifier si une requête a échoué en raison de restrictions côté serveur. Vous pouvez analyser les codes d'état HTTP comme 403 (Accès interdit) ou 503 (Service indisponible).
Exemple de code :
import requests # Faire une requête GET url = 'https://www.example.com' response = requests.get(url) # Vérifier les codes d'état HTTP if response.status_code == 200: print("Requête réussie !") elif response.status_code == 403: print("Accès interdit : Le site a peut-être détecté un bot.") elif response.status_code == 503: print("Service indisponible : Réessayez plus tard.") else: print(f"Erreur {response.status_code}")
Explication du code :
Le code vérifie les codes d'état HTTP retournés par la requête. Un code
403
indique que l'accès est interdit, souvent à cause de la détection d'un bot. Un code503
signifie que le service est temporairement indisponible, et un code200
signifie que la requête a réussi.