当前位置: 首页 > 知识库问答 >
问题:

Selenium WebDriver:修改Navigator.WebDriver标志以防止Selenium检测

酆景辉
2023-03-14
Object.defineProperty(navigator, 'webdriver', {
    get: () => false,
  });

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

共有1个答案

符鸿光
2023-03-14

execute_cdp_cmd():有了execute_cdp_cmd(cmd,cmd_args)命令,您现在可以使用Selenium轻松执行google-chrome-devtools命令。使用此功能,您可以很容易地修改navigator.webdriver以防止检测到硒。

为了防止Selenium驱动的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'})
    

    将webdriver的导航器的属性值更改为undefined

    driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
    

    排除enable-automation交换机的集合

    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    
    options.add_experimental_option('useAutomationExtension', False)
    

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

    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编辑器的草案,当前的实现严格提到:

    用户代理处于远程控制(最初设置为false)时,WebDriver-active标志被设置为true

    Navigator includes NavigatorAutomationInformation;
    

    不应在WorkerNavigator上公开NavigatorAutomationInformation接口。

    NavigatorAutomationInformation接口定义为:

    interface mixin NavigatorAutomationInformation {
        readonly attribute boolean webdriver;
    };
    

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

    在当前的实现中,访问网页而不被检测到的理想方法是使用ChromeOptions()类为以下内容添加几个参数:

    • 排除Enable-Automation交换机的集合
    • 关闭UseAutomationExtension

    通过ChromeOptions的实例,如下所示:

    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/")
    

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

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

  •  类似资料:
    • 问题内容: 我正在尝试使用selenium和铬在网站中自动化一个非常基本的任务,但是以某种方式网站会检测到铬是由selenium驱动的,并阻止每个请求。我怀疑该网站是否依赖像这样的公开DOM变量来检测selenium驱动的浏览器。 我的问题是,有没有办法使navigator.webdriver标志为假?我愿意尝试修改后重新尝试编译selenium源,但似乎无法在存储库中的任何地方找到Navigat

    • 问题内容: 我正在尝试使用selenium和铬在网站中自动化一个非常基本的任务,但是以某种方式网站会检测到铬是由selenium驱动的,并阻止每个请求。我怀疑该网站是否依赖像这样的公开DOM变量https://stackoverflow.com/a/41904453/648236来检测selenium驱动的浏览器。 我的问题是,有没有办法使navigator.webdriver标志为假?我愿意尝试

    • 问题内容: 我想控制全局变量(或全局范围的变量),使其在程序初始化代码中仅设置一次,然后将其锁定。 我对全局变量使用UPPER_CASE_VARIABLES,但是我想有一种确定的方法,无论如何不要更改变量。 python是否提供(或类似)功能? 您如何控制全局范围的变量? 问题答案: Activestate有一个由古老的Alex Martelli 撰写的题为“ Constants in Pytho

    • 我正在实现一个kiosk模式应用程序,我已经成功地使应用程序全屏显示,在4.3之后没有状态栏出现,但在4.3和4.4中无法隐藏状态栏,因为当我们在屏幕顶部向下滑动时,状态栏会出现。 我已经试着在 在清单中指定全屏主题 设置窗口标志ie setFlags setSystemUi可视性 可能重复,但未找到具体解决方案 永久隐藏Android状态栏 最后的事情我想要的是,如何隐藏状态栏永久在一个活动??

    • 我有一个项目,我在模型中使用SQLAlchemy,并尝试集成Alembic进行迁移。当我更改模型时,一切都按预期进行,Alembic看到模型已经更改- 但是当我没有改变模型中的任何东西并且我使用相同的命令时: 修订版给我“空”修订版文件,如下所示: 这个文件的目的是什么?当alembic revision--autogenerate看不到任何更改时,我可以阻止创建这个“空文件”吗?要比较使用Dja

    • 我问这个问题是因为我知道这个线程和这个线程,还有关于同一主题的其他线程,但是每个人在第一个线程中转发的解决方案都不再起作用了。因此,请不要将此标记为关闭,因为第一个线程存在。答案来自2016年,你可以看到更多最近的评论有麻烦。 我在用硒做一些轻微的网刮。我正在与之交互的一个站点显然检测到我的浏览器是自动的(但奇怪的是,只要我也访问了我所在区域之外的站点的版本,我就只关心它,但这并不在这里也不在那里