Chrome设定webdriver以避免Selenium检测
一、WebDriver规范
根据WebDriver规范(https://w3c.github.io/webdriver/#x4-interface)的描述,WebDriver定义了一个标准方法,以便于文档(document)判断当前浏览器处于自动化控制之中。
这个方法就是检测window.navigator.webdriver的值,正常情况下其值为undefined
,自动化控制下为true
。注意,正常情况下不是false
,在JavaScript中undefined
为未定义,即该值不存在,而false
表示一布尔值。
在版本79.0.3945.16
之前,可用如下方法:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument("start-maximized") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option("useAutomationExtension", False) driver = webdriver.Chrome(options=options) driver.get("YOUR_URL") # 在控制台中验证window.navigator.webdriver的值为undefined。 driver.quit()
新版本
在版本79.0.3945.16
之后,ChromeDriver修正了这一“问题”。
execute_cdp_cmd函数来帮忙!cdp即Chrome DevTools Protocal,Chrome开发者工具协议。
通过该函数在文档加载前注入一段js代码以消去webdriver值。
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- from selenium import webdriver driver = webdriver.Chrome() script = ''' Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) ''' driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": script}) driver.get("YOUR_URL") # 在控制台中验证window.navigator.webdriver的值为undefined。 driver.quit()
附上火狐浏览器解决方案(80版本测试有效)
from selenium import webdriver import time profile = webdriver.FirefoxProfile() profile.set_preference("dom.webdriver.enabled", False) profile.set_preference('useAutomationExtension', False) profile.update_preferences() driver = webdriver.Firefox(firefox_profile=profile) driver.get('https://login.aol.com') driver.maximize_window()
浏览器控制台检测
Object.defineProperties(navigator,{webdriver:{get:()=>undefined}})
Object.defineProperties(navigator,{webdriver:{get:()=>false}})
window.navigator.webdriver