Изменение агента пользователя для драйвера селена
У меня есть следующий код в Python
:
from selenium.webdriver import Firefox
from contextlib import closing
with closing(Firefox()) as browser:
browser.get(url)
Я хотел бы напечатать HTTP-заголовок user-agent и
возможно, изменить его. Возможно ли это?
Ответы
Ответ 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()
Это позволяет обмануть пользовательского агента.