当前位置: 首页 > 面试题库 >

是否存在无法检测到的Selenium Webdriver版本?

吕自明
2023-03-14
问题内容

我在ubuntu服务器上的selenium上运行chrome驱动程序。在住宅代理网络的背后。但是我的selenium被查出了。有没有一种方法可以使铬驱动剂和selenium100%无法检测到?

我已经尝试了很久了,但是我却忘记了我所做的许多事情,包括:

  1. 尝试不同版本的Chrome
  2. 添加几个标志并从chrome驱动程序文件中删除一些单词。
  3. 使用隐身模式在代理(也包括住宅)后面运行它。
  4. 加载配置文件。
  5. 随机的鼠标移动。
  6. 随机化一切。

我正在寻找100%无法检测到的selenium的真实版本。(如果曾经存在)或机器人跟踪器无法检测到的另一种自动化方式。

这是浏览器启动的一部分

sx = random.randint(1000,1500)
sn = random.randint(3000,4500)

display = Display(visible=0, size=(sx,sn))
display.start()


    randagent =  random.randint(0,len(useragents_desktop)-1)

    uag = useragents_desktop[randagent]
    #this is to prevent ip leaking
    preferences = 
"webrtc.ip_handling_policy" : "disable_non_proxied_udp",
"webrtc.multiple_routes_enabled": False,
"webrtc.nonproxied_udp_enabled" : False

    chrome_options.add_experimental_option("prefs", preferences)
    chrome_options.add_argument("--disable-dev-shm-usage")
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-impl-side-painting")
    chrome_options.add_argument("--disable-setuid-sandbox")
    chrome_options.add_argument("--disable-seccomp-filter-sandbox")
    chrome_options.add_argument("--disable-breakpad")
    chrome_options.add_argument("--disable-client-side-phishing-detection")
    chrome_options.add_argument("--disable-cast")
    chrome_options.add_argument("--disable-cast-streaming-hw-encoding")
    chrome_options.add_argument("--disable-cloud-import")
    chrome_options.add_argument("--disable-popup-blocking")
    chrome_options.add_argument("--ignore-certificate-errors")
    chrome_options.add_argument("--disable-session-crashed-bubble")
    chrome_options.add_argument("--disable-ipv6")
    chrome_options.add_argument("--allow-http-screen-capture")
    chrome_options.add_argument("--start-maximized")
    wsize = "--window-size=" +  str(sx-10) + ',' + str(sn-10)
    chrome_options.add_argument(str(wsize) )

    prefs = {"profile.managed_default_content_settings.images": 2}
    chrome_options.add_experimental_option("prefs", prefs)

    chrome_options.add_argument("blink-settings=imagesEnabled=true")
    chrome_options.add_argument("start-maximized")
    chrome_options.add_argument("user-agent="+uag)
    chrome_options.add_extension(pluginfile)#this is for the residential proxy
    driver = webdriver.Chrome(executable_path="/usr/bin/chromedriver", chrome_options=chrome_options)

问题答案:

是否 检测到硒驱动的WebDriver 并不 取决于任何特定的 SeleniumChromeChromeDriver
版本。该 网站 本身可以检测网络流量,并可以识别 浏览器客户端 ,即 Web浏览器 作为 的webdriver controled

但是,一些避免在网络抓取过程中被检测到的通用方法如下:

  • 网站可以通过您的 显示器大小 来确定您的脚本/程序的首要属性。因此,建议 不要 使用常规的视口。
  • 如果您需要向网站发送多个请求,则需要继续更改每个请求的用户代理。您可以在Selenium中更改Google Chrome用户代理的方式中找到详细的讨论
  • 为了模拟 人类一样 的行为,你可能需要甚至超越脚本执行减慢WebDriverWait和expected_conditions诱导time.sleep(secs)。在这里您可以找到有关如何在python中hibernateWebdriver毫秒的详细讨论

@Antoine Vastel在其博客网站“检测无头的Chrome”中提到了几种方法,这些方法将 Chrome 浏览器与 无头的 Chrome 浏览器区分开。

  • 用户代理 :用户代理属性通常用于检测操作系统以及用户的浏览器。在Chrome版本59中,它具有以下值:
        Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/59.0.3071.115 Safari/537.36
* 可以通过以下方法检查是否存在 _无头Chrome_ :
                if (/HeadlessChrome/.test(window.navigator.userAgent)) {
            console.log("Chrome headless detected");
        }
  • 插件navigator.plugins返回浏览器中存在的一系列插件。通常,在Chrome上我们会找到默认插件,例如Chrome PDF viewerGoogle Native Client。相反,在无头模式下,返回的数组 包含插件。

    • 可以通过以下方法检查是否存在 插件
          if(navigator.plugins.length == 0) {
      console.log("It may be Chrome headless");
      

      }

  • 语言 :在Chrome中两个JavaScript属性使获得由所使用的语言 user: navigator.languagenavigator.languages 。第一个是浏览器UI的语言,而第二个是代表用户首选语言的字符串数组。但是,在无头模式下,navigator.languages将返回一个 字符串。

    • 可以通过以下方法检查 语言 是否存在:
                if(navigator.languages == "") {
             console.log("Chrome headless detected");
        }
  • WebGL :WebGL是用于在HTML画布中执行3D渲染的API。使用此API,可以查询图形驱动程序的供应商以及图形驱动程序的渲染器。使用普通的Chrome和Linux,我们可以获得渲染器和供应商的以下值:Google SwiftShaderGoogle Inc.。在无头模式下,我们可以获得Mesa OffScreen,它是不使用任何类型的窗口系统进行渲染的技术Brian Paul,并且是启动开源Mesa图形库的程序。

    • 可以通过以下方法检查 WebGL 的存在:
                var canvas = document.createElement('canvas');
        var gl = canvas.getContext('webgl');

        var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
        var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
        var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);

        if(vendor == "Brian Paul" && renderer == "Mesa OffScreen") {
            console.log("Chrome headless detected");
        }
* 并非所有的无头Chrome都具有相同的供应商和渲染器值。其他人保留的值也可以在非无头版本中找到。然而,`Mesa Offscreen`与`Brian Paul`指示的无头版本的存在。
  • 浏览器功能 :Modernizr库可以测试浏览器中是否存在各种HTML和CSS功能。我们发现Chrome与无头Chrome之间的唯一区别是后者没有发际线功能,该功能检测到对的支持hidpi/retina hairlines

    • 可以通过以下方法检查 发际线功能 的存在:
                if(!Modernizr["hairline"]) {
            console.log("It may be Chrome headless");
        }
  • 图片丢失 :我们列表中的最后一个看上去也最坚固,这是由于Chrome无法使用而无法加载的图片尺寸。在使用普通Chrome浏览器的情况下,图像的宽度和高度取决于浏览器的缩放比例,但不为零。在无头Chrome中,图片的宽度和高度等于零。

    • 可以通过以下方法检查是否存在 缺少图像
                var body = document.getElementsByTagName("body")[0];
        var image = document.createElement("img");
        image.src = "http://iloveponeydotcom32188.jg";
        image.setAttribute("id", "fakeimage");
        body.appendChild(image);
        image.onerror = function(){
            if(image.width == 0 && image.height == 0) {
            console.log("Chrome headless detected");
            }
        }   


 类似资料:
  • 编辑:正如答案所提示的,NoSuchElementException是异常,一个错误。在我的例子中,“未找到对象”的情况是有效的行为。因此,考虑到这一点,我提出了另一个解决方案,使用可选。这是传达返回“未找到对象”可能性的最直接的方式。

  • Android Studio项目检测到android_home=C:\users\user\appdata\local\Android\sdk java_home=C:\program files\java\jdk1.8.0_181\bin(节点:3276)unhandledpromiseerejectionwarning:Cordovaerror:Requirements check for J

  • 问题内容: 我想检查工作簿中是否包含工作表名称“ Login”。如果存在,那么我要在其中写入数据row = row + 1,否则直接写入数据,然后关闭报告。所以,任何人都可以让我知道该怎么做。我想用下面的方法做。 主类: WritablData类别: 问题答案: 我在这里没有得到我问题的答案,但是是的,现在我有了解决方案,它对我来说也很好用,请检查以下代码,希望它也对您有所帮助:

  • 本文向大家介绍php通过function_exists检测函数是否存在的方法,包括了php通过function_exists检测函数是否存在的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php通过function_exists检测函数是否存在的方法。分享给大家供大家参考。具体分析如下: php中可以通过function_exists()函数检测另外一个函数是否存在,可以把函数名作为

  • 本文向大家介绍如何检测MySQL中是否存在表?,包括了如何检测MySQL中是否存在表?的使用技巧和注意事项,需要的朋友参考一下 要检测表的存在,请使用INFORMATION_SCHEMA.TABLES的概念。以下是语法- 要了解上述语法,让我们创建一个表- 这是检测数据库中是否存在表的查询- 这将产生以下输出-