Подтвердить что ты не робот

Изменение агента пользователя для драйвера селена

У меня есть следующий код в Python:

from selenium.webdriver import Firefox
from contextlib import closing

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

Я хотел бы напечатать HTTP-заголовок user-agent и возможно, изменить его. Возможно ли это?

4b9b3361

Ответ 1

В Selenium нет способа прочитать заголовки запроса или ответа. Вы можете сделать это, указав, что ваш браузер подключается через прокси-сервер, который записывает эту информацию.

Установка агента пользователя в Firefox

Обычным способом изменения пользовательского агента для Firefox является установка переменной "general.useragent.override" в вашем профиле Firefox. Обратите внимание, что это не зависит от Selenium.

Вы можете направить Selenium на использование профиля, отличного от стандартного, например:

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

Настройка агента пользователя в Chrome

В Chrome, что вы хотите сделать, используйте параметр командной строки user-agent. Опять же, это не вещь Селена. Вы можете вызвать Chrome в командной строке с помощью chrome --user-agent=foo, чтобы установить агент в значение foo.

С Selenium вы устанавливаете его так:

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)

Оба метода, описанные выше, были протестированы и найдены для работы. Я не знаю о других браузерах.

Получение агента пользователя

Selenium не имеет методов запроса пользовательского агента из экземпляра WebDriver. Даже в случае с Firefox вы не можете обнаружить пользовательский агент по умолчанию, указав, что general.useragent.override будет, если оно не установлено на пользовательское значение. (Этот параметр не существует, пока не будет установлено какое-либо значение.)

После запуска браузера вы можете получить агент пользователя, выполнив:

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

В переменной agent будет указан пользовательский агент.

Ответ 2

Чтобы построить на Луи полезный ответ...

Установка агента пользователя в 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)

Единственная незначительная проблема заключается в том, что, в отличие от Firefox и Chrome, это не возвращает вашу настраиваемую настройку:

driver.execute_script("return navigator.userAgent")

Итак, если кто-нибудь выяснит, как это сделать в PhantomJS, пожалуйста, отредактируйте мой ответ или добавьте комментарий ниже! Приветствия.

Ответ 3

В WebDriver отсутствуют заголовки ответа HTTP и коды состояния. Для получения дополнительной информации проверьте эту ссылку

Ответ 4

Чтобы опираться на полезный ответ JJC, который основывается на полезном ответе Луи...

С PhantomJS 2.1.1-windows эта строка работает:

driver.execute_script("return navigator.userAgent")

Если это не сработает, вы все равно можете получить пользовательский агент через журнал (чтобы построить ответ 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'])

Ответ 5

Это краткое решение по изменению запроса UserAgent на лету.

Изменить UserAgent запроса с Chrome

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

driver = webdriver.Chrome(driver_path)
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent":"python 2.7", "platform":"Windows"})
driver.get('http://amiunique.org')

затем верните свой useragent:

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

Некоторые источники

Исходный код webdriver.py из SeleniumHQ (https://github.com/SeleniumHQ/selenium/blob/11c25d75bd7ed22e6172d6a2a795a1d195fb0875/py/selenium/webdriver/chrome/webdriver.py через протокол Chrome расширяет его функциональность через Dev Dev)

def execute_cdp_cmd(self, cmd, cmd_args):
        """
        Execute Chrome Devtools Protocol command and get returned result

Мы можем использовать Chrome Devtools Protocol Viewer для просмотра более расширенных функций (https://chromedevtools.github.io/devtools-protocol/tot/Network#method-setUserAgentOverride), а также типа используемых параметров.

Ответ 6

Попробуйте использовать следующий код:

import urllib

# spoofing user-agent
class AppURLopeneer(urllib.FancyURLopener):
    version = "Mozilla/5.0"

urllib._urlopener = AppURLopeneer()

Это позволяет обмануть пользовательского агента.