logo oujood
🔍

La bibliothèque requests en Python

requests est la bibliothèque Python la plus utilisée pour faire des requêtes HTTP. Ce cours couvre GET, POST, les headers, les paramètres et la gestion des erreurs.

OUJOOD.COM

Pour communiquer avec le web depuis Python — appeler une API, télécharger une page, envoyer des données à un serveur — il faut faire des requêtes HTTP. Python inclut un module urllib pour ça, mais son interface est complexe. La bibliothèque requests fait la même chose avec une syntaxe beaucoup plus simple et lisible. C'est pourquoi elle est devenue la référence absolue dans l'écosystème Python.

Ce cours vous montre comment installer requests, faire des requêtes GET et POST, passer des paramètres et des headers, lire des réponses JSON, et gérer les erreurs proprement.

Installation

requests n'est pas dans la bibliothèque standard — il faut l'installer avec pip :

  📋 Copier le code

# Dans le terminal
pip install requests

# Vérifier l'installation
python -c "import requests; print(requests.__version__)"

Faire une requête GET

Une requête GET récupère des données depuis un serveur. C'est le type de requête le plus courant — c'est ce que fait votre navigateur quand vous ouvrez une page web.

  📋 Copier le code

import requests

reponse = requests.get("https://httpbin.org/get")

# Code de statut HTTP
print(reponse.status_code)
# Résultat : 200 (succès)

# Contenu texte brut
print(reponse.text[:100])

# En-têtes de la réponse
print(reponse.headers["Content-Type"])
# Résultat : application/json

Lire une réponse JSON

Quand l'API retourne du JSON, utilisez directement la méthode .json() de la réponse — elle décode automatiquement le JSON en objet Python, sans avoir à appeler json.loads() manuellement.

  📋 Copier le code

import requests

# API publique qui retourne une blague aléatoire
reponse = requests.get("https://official-joke-api.appspot.com/random_joke")
donnees = reponse.json()

print(donnees["setup"])
print(donnees["punchline"])
# Résultat : une blague en anglais

# Autre exemple : API de conversion de devises (public)
url = "https://api.exchangerate-api.com/v4/latest/USD"
reponse = requests.get(url)
taux = reponse.json()
print(f"1 USD = {taux['rates']['EUR']} EUR")

Passer des paramètres dans l'URL

Plutôt que de construire l'URL à la main avec des ?clé=valeur, passez un dictionnaire au paramètre params. Requests encode automatiquement les valeurs et construit l'URL correcte.

  📋 Copier le code

import requests

# Recherche sur l'API Wikipedia (public, sans clé)
url = "https://fr.wikipedia.org/w/api.php"
parametres = {
    "action": "opensearch",
    "search": "Python",
    "limit": 3,
    "format": "json"
}

reponse = requests.get(url, params=parametres)

# L'URL construite automatiquement :
print(reponse.url)
# https://fr.wikipedia.org/w/api.php?action=opensearch&search=Python&limit=3&format=json

resultats = reponse.json()
print(resultats[1])
# Résultat : liste des titres trouvés

Ajouter des headers

Certaines APIs exigent des en-têtes HTTP particuliers : un token d'authentification, un type de contenu accepté, un User-Agent. Passez-les dans un dictionnaire au paramètre headers.

  📋 Copier le code

import requests

headers = {
    "User-Agent": "MonScript/1.0",
    "Accept": "application/json",
    "Authorization": "Bearer mon_token_ici"
}

reponse = requests.get(
    "https://api.exemple.com/donnees",
    headers=headers
)

print(reponse.status_code)

Faire une requête POST

Une requête POST envoie des données au serveur — un formulaire soumis, des données à créer, une connexion. Le paramètre json sérialise automatiquement le dictionnaire et ajoute l'en-tête Content-Type: application/json.

  📋 Copier le code

import requests

# httpbin.org est un service de test HTTP public
url = "https://httpbin.org/post"

donnees = {
    "nom": "Alice",
    "age": 30,
    "ville": "Paris"
}

# Envoyer du JSON dans le corps de la requête
reponse = requests.post(url, json=donnees)

print(reponse.status_code)
# Résultat : 200

resultat = reponse.json()
print(resultat["json"])
# Résultat : {'nom': 'Alice', 'age': 30, 'ville': 'Paris'}

Gérer les erreurs HTTP

Une requête peut échouer pour plusieurs raisons : serveur inaccessible, URL inexistante (404), accès refusé (403), erreur serveur (500). La méthode raise_for_status() lève automatiquement une exception si le code de statut indique une erreur.

  📋 Copier le code

import requests

try:
    reponse = requests.get("https://httpbin.org/status/404", timeout=5)
    reponse.raise_for_status()
    # Si on arrive ici, la requête a réussi
    donnees = reponse.json()

except requests.exceptions.HTTPError as e:
    print(f"Erreur HTTP : {e}")
    # Résultat : Erreur HTTP : 404 Client Error: NOT FOUND

except requests.exceptions.ConnectionError:
    print("Impossible de joindre le serveur.")

except requests.exceptions.Timeout:
    print("La requête a dépassé le délai imparti.")

except requests.exceptions.RequestException as e:
    print(f"Erreur inattendue : {e}")

Le paramètre timeout=5 fixe un délai maximum en secondes. Sans lui, votre script peut bloquer indéfiniment si le serveur ne répond pas.

Télécharger un fichier

Pour télécharger un fichier volumineux sans le charger entièrement en mémoire, utilisez stream=True et écrivez les données par blocs.

  📋 Copier le code

import requests

url = "https://www.w3.org/WAI/WCAG21/wcag21.pdf"

with requests.get(url, stream=True, timeout=10) as reponse:
    reponse.raise_for_status()
    with open("document.pdf", "wb") as f:
        for bloc in reponse.iter_content(chunk_size=8192):
            f.write(bloc)

print("Téléchargement terminé.")

Utiliser une session pour plusieurs requêtes

Quand vous faites plusieurs requêtes vers le même serveur, une Session réutilise la connexion TCP et les cookies entre les appels. C'est plus efficace qu'une nouvelle connexion à chaque fois, et pratique pour les APIs qui requièrent une authentification persistante.

  📋 Copier le code

import requests

# Créer une session avec des headers communs
with requests.Session() as session:
    session.headers.update({
        "User-Agent": "MonApp/1.0",
        "Authorization": "Bearer mon_token"
    })

    # Les headers sont envoyés automatiquement à chaque requête
    r1 = session.get("https://api.exemple.com/utilisateurs")
    r2 = session.get("https://api.exemple.com/produits")

    print(r1.status_code, r2.status_code)

Par carabde | Mis à jour le 21 avril 2026