Voici une explication détaillée et structurée de votre cours sur la bibliothèque requests, suivie de la résolution
complète de l'exercice pratique.
Part 1: Explication détaillée des Notes et des Codes
La bibliothèque requests est le standard de facto en Python pour interagir avec le Web. Elle remplace des
modules natifs plus complexes comme urllib.
1. Structure globale de la gestion des erreurs (Le bloc try / except)
Dans vos trois exemples de code, l'utilisation de try...except avec response.raise_for_status() est la
meilleure pratique absolue.
En cybersécurité ou en automatisation, un script ne doit jamais planter brutalement si un site est hors ligne
ou si l'API renvoie une erreur. requests propose une hiérarchie d'exceptions très précise :
HTTPError : Déclenché par raise_for_status(). Utile si le serveur répond, mais avec un code d'erreur
(ex: 404 Not Found ou 500 Internal Server Error).
ConnectionError : Le serveur est injoignable (problème de DNS, coupure réseau).
Timeout : Le serveur a mis trop de temps à répondre (très important pour éviter qu'un script ne reste
bloqué indéfiniment).
RequestException : La classe mère. Elle capture toutes les erreurs qui n'ont pas été attrapées par les
blocs précédents.
2. Zoom sur les méthodes : GET vs POST
Caractéristique Requête GET ([Link]) Requête POST ([Link])
Objectif Envoyer/Soumettre des données au
Récupérer/Demander des données.
principal serveur.
Passage de Via l'URL (paramètres visibles : ? Dans le corps (body) de la requête
données q=python). (invisible dans l'URL).
Moins adapté aux données sensibles Adapté aux formulaires, mots de
Sécurité
(exposé dans l'historique). passe, fichiers.
Utilisation
params={...} data={...} (ou json={...})
Python
3. Les En-têtes (Headers) et Paramètres (Params)
params : Transforme automatiquement un dictionnaire en chaîne de requête URL. C'est plus propre et
évite les erreurs de syntaxe ou d'encodage des espaces (ex: transforme "python cybersecurity" en
python%20cybersecurity).
headers (et le User-Agent) : Par défaut, requests envoie un en-tête qui dit ouvertement : "User-
Agent": "python-requests/x.x.x". De nombreux pare-feu applicatifs (WAF) ou serveurs web bloquent cet
en-tête pour éviter le scraping ou les attaques automatisées. Modifier le User-Agent pour simuler un
vrai navigateur (comme Chrome ou Firefox) est la première technique de contournement
apprise en cybersécurité.
Part 2: Résolution de l'Exercice Pratique
Pour répondre aux 5 consignes de l'exercice, nous allons utiliser une API publique gratuite, stable et qui ne
nécessite pas de clé d'authentification : l'API publique GitHub (endpoint de recherche d'utilisateurs).
Code Solution Complet
Python
import requests
# 1. Définition de l'URL de l'API et des paramètres
# Nous allons chercher les informations de l'utilisateur officiel "python"
url = "[Link]
# Ajout d'un User-Agent personnalisé (Bonne pratique)
headers = {
"User-Agent": "MonScriptPedagogique/1.0 (Contact: edu@[Link])"
}
try:
print("Envoi de la requête GET en cours...")
# 2. Envoi de la requête GET avec un timeout de 5 secondes
response = [Link](url, headers=headers, timeout=5)
# Vérification du statut (lève une exception si code 4xx ou 5xx)
response.raise_for_status()
# 3. Affichage du code d'état de la réponse
print(f"[-] Code d'état HTTP : {response.status_code} (Succès)\n")
# 4. Parsing de la réponse JSON
data = [Link]()
# Extraction de deux informations spécifiques
nom_public = [Link]("name", "Non spécifié")
nombre_repos = [Link]("public_repos", 0)
biographie = [Link]("bio", "Aucune biographie")
print("=== INFORMATIONS EXTRAITES ===")
print(f"-> Nom de l'organisation/utilisateur : {nom_public}")
print(f"-> Nombre de dépôts (repositories) publics : {nombre_repos}")
print(f"-> Biographie : {biographie}")
print("==============================")
# 5. Gestion complète des erreurs potentielles
except [Link] as errh:
print(f"[!] Erreur HTTP survenue : {errh}")
except [Link] as errc:
print(f"[!] Erreur de connexion. Vérifiez votre réseau : {errc}")
except [Link] as errt:
print(f"[!] Délai d'attente dépassé (Timeout) : {errt}")
except [Link] as err:
print(f"[!] Une erreur inattendue est survenue : {err}")
Explication des points clés de la résolution :
1. Le choix de l'API : L'URL [Link] renvoie les détails du profil GitHub de
l'organisation Python au format JSON.
2. Sécurité et robustesse (timeout) : J'ai ajouté timeout=5. Si le serveur de GitHub ne répond pas dans
les 5 secondes, le script passe directement dans le bloc except [Link] au lieu de
geler le terminal.
3. Extraction propre (.get()) : Pour extraire les informations du dictionnaire JSON ([Link]("name")), on
utilise la méthode .get() de Python plutôt que data["name"]. C'est une sécurité supplémentaire : si la clé
n'existe pas dans l'API, le script renvoie "Non spécifié" au lieu de planter avec une erreur KeyError.
Avez-vous des questions sur la manipulation des dictionnaires JSON reçus ou souhaitez-vous voir comment
envoyer un fichier via une requête POST ?