developer tip

셀레늄 드라이버에 대한 사용자 에이전트 변경

optionbox 2020. 12. 15. 19:02
반응형

셀레늄 드라이버에 대한 사용자 에이전트 변경


다음 코드가 있습니다 Python.

from selenium.webdriver import Firefox
from contextlib import closing

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

사용자 에이전트 HTTP 헤더를 인쇄하고 변경하고 싶습니다. 가능할까요?


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변수는 사용자 에이전트가 포함됩니다.


Louis의 유용한 답변을 바탕으로 ...

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에서 수행하는 방법을 아는 사람이 있으면 내 답변을 수정하거나 아래에 의견을 추가하십시오! 건배.


이것은 요청 UserAgent를 즉시 변경하는 간단한 솔루션입니다.

Chrome으로 요청의 UserAgent 변경

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')

그런 다음 사용자 에이전트를 반환하십시오.

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

일부 출처

SeleniumHQ ( https://github.com/SeleniumHQ/selenium/blob/11c25d75bd7ed22e6172d6a2a795a1d195fb0875/py/selenium/webdriver/chrome/webdriver.py ) webdriver.py 소스 코드 는 Chrome Devtools 프로토콜을 통해 기능을 확장합니다.

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

We can use the Chrome Devtools Protocol Viewer to list more extended functionalities (https://chromedevtools.github.io/devtools-protocol/tot/Network#method-setUserAgentOverride) as well as the parameters type to use.


To build on JJC's helpful answer that builds on Louis's helpful answer...

With PhantomJS 2.1.1-windows this line works:

driver.execute_script("return navigator.userAgent")

If it doesn't work, you can still get the user agent via the log (to build on Mma's answer):

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'])

ReferenceURL : https://stackoverflow.com/questions/29916054/change-user-agent-for-selenium-driver

반응형