Utilisation efficace des bibliothèques requests et urllib pour les requêtes HTTP en Python

Introduction aux requêtes HTTP en Python

Pour effectuer des requêtes HTTP en Python, deux bibliothèques principales sont souvent utilisées : requests et urllib. La bibliothèque requests simplifie grandement les opérations HTTP, tandis que urllib, intégrée à Python, offre un contrôle plus granulaire.

Utilisation de requests pour sauvegarder des fichiers

Pour télécharger et enregistrer une image, on utilise la méthode GET et on écrit les octets dans un fichier.

import requests
url_image = "http://exemple.com/image.jpg"
requete = requests.get(url=url_image)
with open("image_locale.jpg", "wb") as fichier:
    fichier.write(requete.content)

Requêtes GET et manipulation des réponses

Effectuer une requête GET et inspecter les propriétés de la réponse :

import requests
url_cible = "https://exemple.com/page.html"
reponse = requests.get(url=url_cible)
print(reponse.status_code)  # Code de statut HTTP
print(reponse.text)         # Contenu texte
print(reponse.encoding)     # Encodage détecté
reponse.encoding = "utf-8"  # Forcer un encodage

Pour sauvegarder le contenu HTML dans un fichier :

with open("page.html", "w", encoding="utf-8") as fichier_html:
    fichier_html.write(reponse.text)

Traitement des données JSON et cookies

Interroger une API et récupérer des données JSON :

import requests
endpoint_api = "http://api.exemple.com/donnees"
reponse = requests.get(url=endpoint_api)
donnees_json = reponse.json()
print(donnees_json)
print(reponse.cookies)  # Cookies de la réponse

Pour télécharger un fichier par morceaux avec un générateur :

with open("fichier.jpg", "wb") as fichier:
    for morceau in reponse.iter_content(chunk_size=1024):
        fichier.write(morceau)

Méthodes avancées de requêtes

Utiliser requests.request pour une flexibilité accrue :

import requests
requete = requests.request(method="get", url="http://api.exemple.com/endpoint")
print(requete.json())

Envoyer des paramètres dans l'URL :

parametres = {"cle1": "valeur1"}
requete = requests.get(url="http://api.exemple.com", params=parametres)
print(requete.url)

Pour une requête POST avec corps JSON :

donnees_formulaire = {"utilisateur": "admin", "motdepasse": "1234"}
requete = requests.post(url="http://api.exemple.com/connexion", json=donnees_formulaire)
print(requete.json())

Comparaison avec urllib

urllib est la bibliothèque HTTP intégrée à Python, divisée en modules comme urllib.request et urllib.parse. Elle est plus basique que requests mais offre un contrôle direct.

import urllib.request
reponse_urllib = urllib.request.urlopen("http://www.exemple.com")
contenu = reponse_urllib.read().decode("utf-8")

Pour envoyer des données POST avec urllib :

import urllib.parse
donnees = bytes(urllib.parse.urlencode({"cle": "valeur"}), encoding="utf-8")
reponse = urllib.request.urlopen(url="http://httpbin.org/post", data=donnees)
print(reponse.read().decode("utf-8"))

Gestion des exceptions et configuration

La bibliothèque requests permet de gérer les erreurs courantes comme les timeouts ou les erreurs de connexion :

import requests
from requests.exceptions import ReadTimeout, ConnectionError
try:
    reponse = requests.get(url="https://site.com", timeout=1)
except ReadTimeout:
    print("Délai d'attente dépassé")
except ConnectionError:
    print("Erreur de connexion")

Pour utiliser des proxies ou désactiver la vérification SSL :

proxies = {"http": "http://proxy:8080"}
reponse = requests.get(url="https://site.com", proxies=proxies, verify=False)

Sessions et authentification

Les sessions maintiennent les cookies entre les requêtes :

session = requests.Session()
session.get("http://exemple.com/login")
reponse = session.get("http://exemple.com/dashboard")
print(reponse.text)

L'authentification HTTP de base peut être configurée ainsi :

reponse = requests.get(url="http://exemple.com/secure", auth=("utilisateur", "motdepasse"))

Utilisation de urllib.robotparser

Pour vérifier les règles d'exploration d'un site web :

import urllib.robotparser
parser = urllib.robotparser.RobotFileParser()
parser.set_url("http://exemple.com/robots.txt")
parser.read()
print(parser.can_fetch("*", "http://exemple.com/page"))

Étiquettes: Python requests urllib HTTP API

Publié le 21 juin à 20h11