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}")
    Résultat du code

    Explication du code :

    Définir un user-agent personnalisé

    headers = {...} définit un dictionnaire headers 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 sur en-US).

    'Accept-Encoding': 'gzip, deflate, br' demande la compression de la réponse pour optimiser la taille des données transmises. gzip, deflate et br 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 dans headers.

    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}")
    Résultat du 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 dictionnaire headers contenant un en-tête HTTP User-Agent avec une valeur choisie aléatoirement à partir de la liste user_agents, en utilisant la fonction random.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ête User-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.