web-dev-qa-db-fra.com

Changer l'agent utilisateur pour le pilote Selenium

J'ai le code suivant dans Python:

from Selenium.webdriver import Firefox
from contextlib import closing

with closing(Firefox()) as browser:
  browser.get(url)

J'aimerais imprimer l'en-tête HTTP de l'agent utilisateur et Éventuellement le changer. C'est possible?

50
xralf

Selenium ne permet pas de lire les en-têtes de requête ou de réponse. Vous pouvez le faire en demandant à votre navigateur de se connecter via un proxy qui enregistre ce type d'informations.

Définition de l'agent d'utilisateur dans Firefox

La méthode habituelle pour changer l'agent utilisateur pour Firefox consiste à définir la variable "general.useragent.override" dans votre profil Firefox. Notez que cela est indépendant de sélénium.

Vous pouvez demander à Selenium d’utiliser un profil différent de celui par défaut, comme ceci:

from Selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_preference("general.useragent.override", "whatever you want")
driver = webdriver.Firefox(profile)

Définition de l'agent d'utilisateur dans Chrome

Avec Chrome, vous souhaitez utiliser l’option user-agent en ligne de commande. Encore une fois, ce n’est pas une affaire de sélénium. Vous pouvez appeler Chrome sur la ligne de commande avec chrome --user-agent=foo pour définir l'agent sur la valeur foo.

Avec Selenium vous le définissez comme ceci:

from Selenium import webdriver
from Selenium.webdriver.chrome.options import Options
opts = Options()
opts.add_argument("user-agent=whatever you want")

driver = webdriver.Chrome(chrome_options=opts)

Les deux méthodes ci-dessus ont été testées et jugées efficaces. Je ne connais pas les autres navigateurs.

Obtenir l'agent d'utilisateur

Selenium ne dispose pas de méthodes pour interroger l'agent utilisateur à partir d'une instance de WebDriver. Même dans le cas de Firefox, vous ne pouvez pas découvrir l'agent d'utilisateur par défaut en vérifiant ce que serait general.useragent.override s'il n'était pas défini sur une valeur personnalisée. (Ce paramètre n'existe pas existe avant qu'il ne soit défini sur une valeur.)

Une fois le navigateur démarré, vous pouvez obtenir l'agent utilisateur en exécutant:

agent = driver.execute_script("return navigator.userAgent")

La variable agent contiendra l'agent utilisateur.

96
Louis

S'appuyant sur la réponse utile de Louis ...

Définition de l'agent d'utilisateur dans PhantomJS

from Selenium import webdriver
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities
...
caps = DesiredCapabilities.PHANTOMJS
caps["phantomjs.page.settings.userAgent"] = "whatever you want"
driver = webdriver.PhantomJS(desired_capabilities=caps)

Le seul problème mineur est que, contrairement à Firefox et Chrome, cela ne retourne pas votre paramètre personnalisé:

driver.execute_script("return navigator.userAgent")

Donc, si quelqu'un trouve comment faire cela dans PhantomJS, veuillez modifier ma réponse ou ajouter un commentaire ci-dessous! À votre santé.

14
JJC

S'appuyant sur la réponse utile de JJC qui s'appuie sur la réponse utile de Louis ...

Avec PhantomJS 2.1.1-windows, cette ligne fonctionne:

driver.execute_script("return navigator.userAgent")

Si cela ne fonctionne pas, vous pouvez toujours obtenir l'agent utilisateur via le journal (pour construire sur réponse de Mma ): 

from Selenium import webdriver
import json
from fake_useragent import UserAgent

dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (UserAgent().random)
driver = webdriver.PhantomJS(executable_path=r"your_path", desired_capabilities=dcap)
har = json.loads(driver.get_log('har')[0]['message']) # get the log
print('user agent: ', har['log']['entries'][0]['request']['headers'][1]['value'])
0
J. Does