硒网络驱动程序:修改 navigator.webdriver 标志以防止硒检测

我试图使用硒和铬在网站上自动执行一个非常基本的任务,但不知何故,网站检测到铬何时由硒驱动并阻止每个请求。我怀疑该网站依赖于像这样的公开DOM变量,https://stackoverflow.com/a/41904453/648236 来检测硒驱动的浏览器。

我的问题是,有没有办法使navigator.webdriver标志错误?我愿意在进行修改后尝试重新编译硒源,但我似乎无法在存储库中的任何位置找到NavigatorAutomationInformation源 https://github.com/SeleniumHQ/selenium

任何帮助将不胜感激

附言:我还从 https://w3c.github.io/webdriver/#interface 尝试了以下内容

Object.defineProperty(navigator, 'webdriver', {
    get: () => false,
  });

但它仅在初始页面加载后更新属性。我认为该网站在执行我的脚本之前检测到变量。


答案 1

首先更新 1

execute_cdp_cmd():随着命令的可用性,现在您可以使用Selenium轻松执行命令。使用此功能,您可以轻松修改,以防止硒被检测到。execute_cdp_cmd(cmd, cmd_args)navigator.webdriver


防止检测 2

为了防止硒驱动的WebDriver被检测到,利基方法将包括以下所有提到的步骤之一/ 所有步骤:

  • 添加参数 --disable-blink-features=AutomationControlled

    from selenium import webdriver
    
    options = webdriver.ChromeOptions() 
    options.add_argument('--disable-blink-features=AutomationControlled')
    driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get("https://www.website.com")
    

你可以在硒找不到第二页找到相关的详细讨论

  • 通过命令轮换,如下所示:execute_cdp_cmd()

    #Setting up Chrome/83.0.4103.53 as useragent
    driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
    
  • Web 驱动程序导航器的属性值更改为未定义

    driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
    
  • 排除交换机集合enable-automation

    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    
  • 关断useAutomationExtension

    options.add_experimental_option('useAutomationExtension', False)
    

示例代码 3

将上面提到的所有步骤和有效的代码块组合在一起将是:

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, executable_path=r'C:\WebDrivers\chromedriver.exe')
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
print(driver.execute_script("return navigator.userAgent;"))
driver.get('https://www.httpbin.org/headers')

历史

根据W3C编辑的草案,当前的实现严格提到:

用户代理处于远程控制之下时,Webdriver 活动标志设置为 true,该标志最初设置为 false

进一步

Navigator includes NavigatorAutomationInformation;

需要指出的是:

接口不应在 WorkerNavigator 上公开。NavigatorAutomationInformation

接口定义为:NavigatorAutomationInformation

interface mixin NavigatorAutomationInformation {
    readonly attribute boolean webdriver;
};

如果设置了标志,则返回 true,否则返回 false。webdriver-active

最后,为合作用户代理定义了一种标准方式,以通知文档它由 WebDriver 控制,以便在自动化过程中可以触发备用代码路径。navigator.webdriver

警告: 更改/调整上述参数可能会阻止导航并检测到 WebDriver 实例。


更新 (6-十一月-2019)

从当前实现开始,在不被检测到的情况下访问网页的理想方法是使用该类向以下对象添加几个参数:ChromeOptions()

  • 排除交换机集合enable-automation
  • 关断useAutomationExtension

通过如下实例:ChromeOptions

  • Java 示例:

    System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
    options.setExperimentalOption("useAutomationExtension", false);
    WebDriver driver =  new ChromeDriver(options);
    driver.get("https://www.google.com/");
    
  • Python 示例

    from selenium import webdriver
    
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\path\to\chromedriver.exe')
    driver.get("https://www.google.com/")
    
  • 红宝石示例

      options = Selenium::WebDriver::Chrome::Options.new
      options.add_argument("--disable-blink-features=AutomationControlled")
      driver = Selenium::WebDriver.for :chrome, options: options
    

传说

1:仅适用于Selenium的Python客户端。

2:仅适用于Selenium的Python客户端。

3:仅适用于Selenium的Python客户端。


答案 2

ChromeDriver

终于用一个简单的标志发现了这个简单的解决方案!:)

--disable-blink-features=AutomationControlled

navigator.webdriver=true 将不再显示该标志集。

有关您可以禁用的内容列表,请在此处查看


推荐