L'interaction avec les cookies HTTP est une tâche courante lors du développement d'applications web ou de scripts d'exploration de données. La bibliothèque Python requests simplifie grandement cette gestion, que ce soit pour récupérer les en-têtes bruts Set-Cookie ou pour manipuler les cookies parsés sous forme de dictionnaires.
Accéder directement à l'en-tête Set-Cookie
Lorsqu'un serveur envoie des cookies, il les inclut dans la réponse HTTP via l'en-tête Set-Cookie. Il est possible de récupérer la valeur brute de cet en-tête directement à partir des en-têtes de la réponse. Notez que si plusieurs en-têtes Set-Cookie sont envoyés, requests peut les concaténer ou ne renvoyer que le dernier, selon la configuration du serveur et la version HTTP. Chaque cookie et ses attributs (comme Path, Domain, Expires) sont généralemetn séparés par un point-virgule.
import requests
# URL cible pour l'exemple
url_demo = "http://www.example.com"
# Envoi de la requête GET
reponse_http = requests.get(url_demo)
# Récupération de l'en-tête "Set-Cookie" brut de la réponse
# Si le serveur envoie plusieurs directives Set-Cookie, requests.headers.get('Set-Cookie')
# retourne une chaîne qui peut contenir plusieurs cookies ou seulement le dernier.
en_tete_set_cookie_brut = reponse_http.headers.get("Set-Cookie")
print(f"En-tête 'Set-Cookie' brut reçu : {en_tete_set_cookie_brut}")
# Pour extraire la première valeur si l'en-tête contient plusieurs parties de cookie (simplifié)
if en_tete_set_cookie_brut:
premiere_partie_cookie = en_tete_set_cookie_brut.split(';')[0]
print(f"Première partie significative du Set-Cookie : {premiere_partie_cookie}")
Utiliser l'objet response.cookies pour une gestion simplifiée
La manière la plus robuste et la plus simple de gérer les cookies avec requests est d'utiliser l'attribut .cookies de l'objet réponse. Cet attribut fournit un objet CookieJar, qui gère automatiquement le parsing, les attributs des cookies et leur persistance pour les requêtes futures si vous utilisez une session. Vous pouvez facilement convertir cet objet en un dictionnaire Python standard pour une manipulation aisée.
import requests
# URL de test où des cookies peuvent être définis
url_cible_cookies = "http://httpbin.org/cookies/set?session_id=abc123&theme=dark"
# Envoi de la requête GET
reponse_serveur = requests.get(url_cible_cookies)
# Accès à l'objet CookieJar et conversion en dictionnaire Python
dictionnaire_de_cookies = reponse_serveur.cookies.get_dict()
print(f"Dictionnaire de cookies parsés : {dictionnaire_de_cookies}")
# Accéder à un cookie spécifique par son nom
if 'session_id' in dictionnaire_de_cookies:
valeur_session = dictionnaire_de_cookies['session_id']
print(f"Valeur du cookie 'session_id' : {valeur_session}")
Gérer les cookies lors des redirections HTTP (code 302)
Lorsqu'une requête aboutit à une redirection (par exemple, un code de statut 302 Found), il est parfois nécessaire de comprendre comment les cookies sont transférés ou définis à chaque étape. Par défaut, requests suit automatiquement les redirections. Cependant, si vous désactivez le suivi des redirections (allow_redirects=False), vous pouvez inspecter la réponse intermédiaire, y compris les en-têtes Set-Cookie qui y sont potentiellement inclus.
L'exemple suivant montre comment intercepter une réponse de redirection et examiner son en-tête Set-Cookei. Il est important de noter que requests gère de manière transparente la collection de cookies à travers toute une chaîne de redirections si le suivi est activé.
import requests
# URL qui génère une redirection (par exemple, httpbin.org/redirect/1)
# Si un serveur définit un cookie avec la réponse 302, il sera dans l'en-tête Set-Cookie de cette réponse.
url_avec_redirection = "http://httpbin.org/status/302"
print(f"Tentative de requête vers : {url_avec_redirection}")
try:
# Envoi de la requête en désactivant le suivi automatique des redirections pour capturer le 302
reponse_intermediaire = requests.get(url_avec_redirection, allow_redirects=False)
print(f"Statut HTTP de la réponse initiale : {reponse_intermediaire.status_code}")
# Vérification si la réponse est un code de redirection (301, 302, 303, 307, 308)
if reponse_intermediaire.status_code in [301, 302, 303, 307, 308]:
print("Une redirection a été détectée.")
location_header = reponse_intermediaire.headers.get('Location')
if location_header:
print(f"L'en-tête 'Location' indique la destination : {location_header}")
# Récupération de l'en-tête "Set-Cookie" de cette réponse de redirection
en_tete_cookie_302 = reponse_intermediaire.headers.get('Set-Cookie')
if en_tete_cookie_302:
print(f"En-tête 'Set-Cookie' trouvé dans la réponse 302 : {en_tete_cookie_302}")
# Pour une analyse détaillée de cet en-tête, il faudrait un parser spécifique.
# L'objet `response.cookies` gère cette complexité automatiquement pour la session.
else:
print("Aucun en-tête 'Set-Cookie' spécifique n'a été trouvé dans la réponse 302.")
else:
print("La réponse n'est pas une redirection HTTP.")
# Illustrer comment requests gère les cookies après une redirection si elle est suivie
print("\n--- Comportement par défaut : Suivi des redirections et collecte des cookies ---")
# requests suit les redirections par défaut et accumule les cookies tout au long du chemin
# Utilisation d'une URL qui redirige et qui définit un cookie à la destination finale
url_finale_avec_cookies = "http://httpbin.org/redirect-to?url=http://httpbin.org/cookies/set/utilisateur_id/12345"
reponse_finale_apres_redirection = requests.get(url_finale_avec_cookies)
print(f"Statut HTTP de la réponse finale (après suivi de redirection) : {reponse_finale_apres_redirection.status_code}")
cookies_collectes_finaux = reponse_finale_apres_redirection.cookies.get_dict()
print(f"Cookies collectés après la chaîne de redirection complète : {cookies_collectes_finaux}")
except requests.exceptions.RequestException as e:
print(f"Une erreur est survenue lors de la requête : {e}")