Gérer les headers et user-agents pour éviter les blocages
Lors du web scraping ou de l’interaction avec des API, il est fréquent que les serveurs bloquent ou limitent les requêtes en fonction de certains paramètres, comme l’user-agent ou les headers HTTP. Le user-agent est un identifiant envoyé par le navigateur ou l’application, qui indique le type de client effectuant la requête. En utilisant un user-agent valide et en simulant un navigateur courant (par exemple, Chrome ou Firefox), vous pouvez éviter que vos requêtes soient considérées comme provenant d’un bot et être bloquées. Les headers HTTP permettent aussi de personnaliser la requête, en spécifiant des informations comme le type de contenu accepté, les cookies ou l’acceptation de la langue. Pour éviter les blocages, vous pouvez : Changer régulièrement de user-agent pour simuler différentes sources de trafic. Ajouter des headers personnalisés pour rendre les requêtes plus naturelles. Utiliser des techniques comme les délais entre les requêtes ou le rotating des IP pour minimiser le risque de détection.
Fonctions :
-
Utilisation des headers personnalisés
Ajouter des headers personnalisés dans vos requêtes HTTP permet de simuler un comportement plus naturel et d'éviter que votre requête soit perçue comme un "bot". En particulier, l'ajout de l'en-tête User-Agent aide à simuler un navigateur réel.
Attributs :
Paramètre Description User-Agent
Identifie le client qui effectue la requête (par exemple, un navigateur ou un bot). Accept-Language
Spécifie la langue préférée pour la réponse. Accept-Encoding
Déclare les encodages que le client peut accepter, comme la compression. Connection
Gère la connexion, par exemple, maintenir la connexion ouverte. Exemple de code :
import requests # Définir un user-agent personnalisé 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', 'Accept-Language': 'en-US,en;q=0.9', # Optionnel: Spécifie la langue préférée pour la réponse 'Accept-Encoding': 'gzip, deflate, br', # Optionnel: Compression des données 'Connection': 'keep-alive' # Optionnel: Maintien de la connexion ouverte pour plusieurs requêtes } # Faire une requête GET avec les headers url = 'https://www.example.com' response = requests.get(url, headers=headers) # Vérifier le statut de la réponse if response.status_code == 200: print("Requête réussie !") else: print(f"Erreur {response.status_code}")
Explication du code :
Définir un user-agent personnalisé
headers = {...}
définit un dictionnaireheaders
contenant plusieurs en-têtes HTTP personnalisés qui seront envoyés avec la requête GET.'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'
spécifie un user-agent, ici un navigateur Chrome sous Windows 10.'Accept-Language': 'en-US,en;q=0.9'
indique la langue préférée pour la réponse HTTP (ici l'anglais avec un léger poids suren-US
).'Accept-Encoding': 'gzip, deflate, br'
demande la compression de la réponse pour optimiser la taille des données transmises.gzip
,deflate
etbr
sont des formats de compression.'Connection': 'keep-alive'
indique que la connexion doit être maintenue ouverte pour effectuer plusieurs requêtes sans devoir se reconnecter à chaque fois.Faire une requête GET avec les headers
url = 'https://www.example.com'
définit l'URL de la page web cible pour la requête GET.response = requests.get(url, headers=headers)
envoie une requête HTTP GET à l'URL spécifiée, avec les en-têtes personnalisés définis dansheaders
.Vérification du statut de la réponse
if response.status_code == 200:
vérifie si le code de statut HTTP de la réponse est égal à 200, ce qui signifie que la requête a réussi.Requête réussie
print("Requête réussie !")
affiche le message "Requête réussie !" si le code de statut est 200, indiquant que la requête a été traitée correctement.Gestion des erreurs
else:
si le code de statut de la réponse n'est pas 200, une erreur s'affiche.print(f"Erreur {response.status_code}")
affiche un message d'erreur contenant le code de statut HTTP si la requête échoue. -
Rotation des User-Agents
Les sites web peuvent détecter et bloquer les requêtes provenant de l'utilisation répétée d'un même user-agent. Pour éviter cela, il est utile de changer le user-agent à chaque requête ou après quelques requêtes.
Exemple de code :
import requests import random # Liste de différents user-agents user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Edge/18.18362' ] # Choisir un user-agent au hasard headers = { 'User-Agent': random.choice(user_agents) } # Faire une requête GET avec un user-agent rotatif url = 'https://www.example.com' response = requests.get(url, headers=headers) # Vérifier le statut de la réponse if response.status_code == 200: print("Requête réussie !") else: print(f"Erreur {response.status_code}")
Explication du code :
Liste de différents user-agents
user_agents = [...]
définit une liste de chaînes représentant différents user-agents. Ces user-agents sont des chaînes qui identifient le navigateur ou l'appareil utilisé lors d'une requête HTTP.Choisir un user-agent au hasard
headers = {'User-Agent': random.choice(user_agents)}
crée un dictionnaireheaders
contenant un en-tête HTTPUser-Agent
avec une valeur choisie aléatoirement à partir de la listeuser_agents
, en utilisant la fonctionrandom.choice()
.Faire une requête GET avec un user-agent rotatif
url = 'https://www.example.com'
définit l'URL de la page web cible pour la requête GET.response = requests.get(url, headers=headers)
envoie une requête HTTP GET à l'URL spécifiée avec l'en-têteUser-Agent
rotatif, ce qui simule différentes sources de requêtes pour éviter d'être bloqué par un site web.Vérification du statut de la réponse
if response.status_code == 200:
vérifie si le code de statut HTTP de la réponse est égal à 200, ce qui signifie que la requête a réussi.Requête réussie
print("Requête réussie !")
affiche le message "Requête réussie !" si le code de statut est 200, indiquant que la requête a été traitée correctement.Gestion des erreurs
else:
si le code de statut de la réponse n'est pas 200, une erreur s'affiche.print(f"Erreur {response.status_code}")
affiche un message d'erreur contenant le code de statut HTTP si la requête échoue.