Guide pour User-Agent dans Selenium : paramétrage et modification

Apprenez à définir et à provoquer la rotation des en-têtes User-Agent dans Selenium pour améliorer vos capacités de web scraping et contourner les mesures anti-bot.
12 min de lecture
Selenium User Agent Guide Setting and Changing

Dans ce tutoriel, vous allez apprendre :

  • Pourquoi l’en-tête User-Agent est si important
  • La valeur par défaut de l’agent utilisateur Selenium dans les navigateurs headed et headless
  • Comment changer l’agent utilisateur dans Selenium
  • Comment implémenter la rotation des agents utilisateurs dans Selenium

C’est parti !

Pourquoi l’en-tête de l’agent utilisateur est-il important ?

L’en-tête User-Agent est une chaîne qui identifie le logiciel client à l’origine de la requête HTTP. Il comprend généralement des informations sur le type de navigateur ou d’application, le système d’exploitation et l’architecture d’où provient la demande. Ceci est généralement défini par les navigateurs, les clients HTTP ou toute autre application effectuant des requêtes Web.

Par exemple, vous trouverez ci-dessous l’agent utilisateur défini par Chrome au moment de la rédaction de cet article :

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36

Les composants de cette chaîne d’agent utilisateur sont les suivants :

  • Mozilla/5.0 : historiquement utilisé pour indiquer la compatibilité avec les navigateurs Mozilla. Il représente désormais un préfixe ajouté pour des raisons de compatibilité.
  • Windows NT 10.0; Win64; x64 : système d’exploitation (Windows NT 10.0), plateforme (Win64) et architecture (x64).
  • AppleWebKit/537.36 : moteur de navigation sur lequel Chrome s’appuie.
  • KHTML, comme Gecko : compatibilité avec le moteur KHTML et le moteur de mise en page Gecko utilisés par Mozilla.
  • Chrome/125.0.0.0 : nom et version du navigateur.
  • Safari/537.36 : compatibilité avec Safari.

En termes simples, l’agent utilisateur identifie si la requête provient d’un navigateur connu ou d’un autre type de logiciel.

Les bots de scraping et les scripts d’automatisation des navigateurs ont tendance à utiliser des chaînes d’agent utilisateur par défaut ou incohérentes. Celles-ci révèlent leur nature automatisée aux yeux des solutions anti-scraping, qui protègent les données des pages Web en surveillant les requêtes entrantes. En examinant l’en-tête User-Agent, ils peuvent déterminer si l’utilisateur actuel est légitime ou s’il s’agit d’un bot.

Pour en savoir plus, consultez notre guide sur les agents utilisateurs pour le web scraping.

Qu’est-ce que l’agent utilisateur Selenium par défaut ?

L’en-tête User-Agent défini par Selenium lors de la demande HTTP GET pour récupérer une page Web dépend du navigateur sous contrôle et de la présence du mode headed ou du mode headless. 

Remarque : dans cet article, nous allons utiliser Selenium en Python et le configurer pour qu’il fonctionne sur Chrome. Cependant, vous pouvez facilement étendre ce que vous allez apprendre ici à différents langages de programmation et navigateurs.

Pour voir la chaîne de l’agent utilisateur Selenium, créez un script d’automatisation du navigateur de base qui visite la page httpbin.io /user-agent. Il ne s’agit que d’une API qui renvoie l’en-tête User-Agent de la requête entrante.

Importez selenium, initialisez une instance de Chrome, visitez la page souhaitée et imprimez son contenu :

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

# enable headless mode in Selenium

options = Options()

# options.add_argument('--headless')

# initialize a Chrome instance

driver = webdriver.Chrome(

    options=options,

)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

# print the page content

print(user_agent_info)

# close the browser

driver.quit()

Lancez le script Python ci-dessus, et il se connectera au terminal d’une façon similaire à ceci :

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

La valeur correspond à l’en-tête User-Agent défini par Chrome au moment de la rédaction de cet article. Cela ne devrait pas vous surprendre, car Selenium fonctionne sur une véritable fenêtre de navigateur.

Dans le même temps, Selenium est généralement configuré pour contrôler les instances de navigateur headless. La raison en est que le chargement de l’interface utilisateur d’un navigateur nécessite beaucoup de ressources et n’apporte aucun avantage en production. Décommentez donc l’option --headless pour exécuter le script en mode headless. Cette fois, le résultat sera :

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/125.0.6422.142 Safari/537.36"

}

Comme vous pouvez le constater, Chrome/125.0.0.0 a été remplacé par HeadlessChrome/125.0.6422.142. Cette valeur identifie clairement la requête comme provenant d’un outil d’automatisation de navigateur, car aucun utilisateur humain n’utiliserait jamais un navigateur headless. La conséquence est que les systèmes anti-bot peuvent marquer une telle requête comme provenant d’un bot et la bloquer. Voici pourquoi il est si crucial de définir la valeur de l’agent utilisateur Selenium!

Pour en savoir plus, consultez notre guide sur le web scraping avec Selenium.

Comment changer d’agent utilisateur dans Selenium

Selenium propose deux méthodes pour définir la valeur de l’agent utilisateur. Explorons-les tous les deux !

Configurer l’agent utilisateur de manière globale

Parmi les options prises en charge par Chrome, il y a également la balise --user-agent. Cela vous permet de spécifier l’agent utilisateur global que le processus Chrome doit utiliser lors de la visite de pages Web dans ses onglets ou ses fenêtres.

Définissez un agent utilisateur global dans Selenium avec Python comme ci-dessous :

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

options = Options()

# set a custom user agent in the browser option

options.add_argument(f'--user-agent={custom_user_agent}')

# other options...

# initialize a Chrome instance with a custom user agent

driver = webdriver.Chrome(

    options=options,

)

Assemblez le tout et vérifiez qu’il fonctionne avec le script suivant :

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

options = Options()

# set a custom user agent in the browser option

options.add_argument(f'--user-agent={custom_user_agent}')

# enable headless mode

options.add_argument('--headless')

# initialize a headless Chrome instance with a custom user agent

driver = webdriver.Chrome(

    options=options,

)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

# print the page content

print(user_agent_info)

# close the browser

driver.quit()

Maintenant, lancez le script et il affichera :

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

Cela correspond à l’agent utilisateur spécifié dans la chaîne custom_user_agent. En particulier, le navigateur contrôlé via Selenium expose désormais la valeur de l’agent utilisateur d’un navigateur headed, même s’il est en mode headless. Cette astuce devrait suffire à tromper des solutions anti-bots moins complexes.

Le principal inconvénient de cette approche est que vous ne pouvez définir la balise --user-agent qu’une seule fois, lors de la configuration de l’instance du navigateur. Une fois spécifié, l’agent utilisateur personnalisé sera utilisé pendant toute la session de navigation, sans possibilité de le modifier à la volée avant un appel get().

Configurer l’agent utilisateur localement

Les commandes du protocole Chrome Devtools (CDP) vous permettent de communiquer avec un navigateur Chrome en cours d’exécution. Elles vous permettent notamment de modifier dynamiquement les valeurs par défaut et les configurations définies par le navigateur.

Vous pouvez exécuter une commande CDP dans Selenium en utilisant la méthode execute_cdp_cmd() exposée par l’objet driver. Plus précisément, la commande CDP Network.setUserAgentOverride remplace l’agent utilisateur par la chaîne donnée. Utilisez-la pour modifier localement l’agent utilisateur dans Selenium comme ci-dessous :

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

Vérifiez que cette approche vous permet de mettre à jour l’agent utilisateur plusieurs fois au cours de la même session de navigation en suivant la logique suivante :

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

options = Options()

# enable headless mode

options.add_argument('--headless')

# initialize a headless Chrome instance

driver = webdriver.Chrome(

    options=options,

)

# configure a custom user agent

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content and print it

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# set another user agent

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

# reload the page

driver.refresh()

# print the page content

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# close the browser

driver.quit()

Lancez le script ci-dessus, et il produira :

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"

}

Génial ! Deux chaînes d’agent utilisateur Selenium différentes au cours de la même session de navigation.

Implémenter la rotation des agents utilisateurs dans Selenium

La définition d’un en-tête User-Agent non headless peut ne pas suffire à vaincre les solutions anti-bots. Le problème est qu’un trop grand nombre de requêtes provenant de la même adresse IP et avec les mêmes en-têtes est susceptible de révéler la nature automatisée de votre script Selenium. 

La clé pour éviter la détection des bots est de randomiser vos demandes, par exemple en mettant en œuvre une rotation des agents utilisateurs. L’idée qui sous-tend cette approche est de choisir au hasard un agent utilisateur avant de naviguer vers une page dans Selenium. Ainsi, vos requêtes automatisées apparaîtront comme provenant de différents navigateurs, ce qui réduira le risque de déclenchement de blocages et de bannissements.

À présent, suivez les étapes ci-dessous et apprenez à implémenter la rotation des agents utilisateurs dans Selenium !

Étape #1 : récupérez une liste d’agents utilisateurs

Obtenez des agents utilisateurs appropriés à partir d’un portail tel que User Agent String.com et stockez-les dans un tableau Python comme suit :

user_agents = [

    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15"

    # other user agents...

]

Étape #2 : extrayez un agent utilisateur aléatoire

Définissez une fonction personnalisée pour définir l’agent utilisateur aléatoire sur l’objet du pilote Web Selenium :

def set_user_agent(driver):

    # set the user agent...

Importez le package random depuis la Python Standard Library pour vous préparer à choisir au hasard un agent utilisateur dans la liste user_agents :

import random

Utilisez la fonction random.choice() pour extraire de manière aléatoire une chaîne d’agent utilisateur du tableau :

random_user_agent = random.choice(user_agents)

Ensuite, attribuez-la à la fenêtre Chrome à l’aide de la fonction execute_cdp_cmd() :

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

Votre fonction set_user_agent() contiendra désormais :

def set_user_agent(driver):

    # randmoly pick a user agent string from the list

    random_user_agent = random.choice(user_agents)

    # set the user agent in the driver

    driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

Étape #3 : définissez l’agent utilisateur aléatoire

Avant d’accéder à une page contenant get(), appelez la fonction set_user_agent() pour modifier l’agent utilisateur Selenium :

# set a custom user agent

set_user_agent(driver)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

Étape #4 : pour terminer 

Voici à quoi ressemblera votre script de rotation des agents utilisateurs Python Selenium :

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

import random

user_agents = [

    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15"

]

def set_user_agent(driver):

    # randmoly pick a user agent string from the list

    random_user_agent = random.choice(user_agents)

    # set the user agent in the driver

    driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

options = Options()

# enable headless mode

options.add_argument('--headless')

# initialize a headless Chrome instance

driver = webdriver.Chrome(

    options=options,

)

# set a custom user agent

set_user_agent(driver)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content and print it

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# close the browser

driver.quit()

Exécutez ce script plusieurs fois et remarquez qu’il imprime différentes chaînes d’agent utilisateur.

Et voilà ! Vous êtes désormais passé maître dans l’art de changer d’agent utilisateur dans Selenium.

Conclusion

Dans ce guide, vous avez appris l’importance de l’en-tête User-Agent et comment le remplacer dans Selenium. Cette technique vous permet de tromper les systèmes anti-bots de base en leur faisant croire que vos demandes proviennent d’un navigateur légitime non headless. Cependant, des solutions avancées peuvent toujours être en mesure de vous détecter et de vous bloquer. Pour éviter les interdictions d’adresses IP, vous pourriez intégrer un proxy à Selenium, mais même cela ne suffira peut-être pas !

Évitez ces problèmes avec Scraping Browser, un navigateur de nouvelle génération qui s’intègre à Selenium et à tout autre outil d’automatisation des navigateurs. Scraping Browser peut facilement contourner les technologies anti-bot pour vous tout en évitant de laisser les traces du navigateur. Sous le capot, il repose sur des fonctionnalités telles que la rotation des agents utilisateurs, la rotation des adresses IP et la résolution de CAPTCHA. L’automatisation des navigateurs n’a jamais été aussi simple !

Aucune carte de crédit requise