selenium和非无头浏览器不断要求验证码

selenium和非无头浏览器不断要求验证码,第1张

selenium和非无头浏览器不断要求验证码

在题为“ recaptcha 3如何知道我正在使用硒/chromedriver”的讨论中,我们讨论了一些通用的方法,以避免在网络抓取时被检测到。让我们深入探讨。


无头浏览器

无头浏览器是无需图形界面即可使用的浏览器。可以通过编程方式对其进行控制,以自动化任务,例如进行测试或拍摄网页截图。


为什么要检测无头浏览器?

根据@AntoineVastel,无头浏览器用于自动执行恶意任务。最常见的情况是网页抓取,增加广告展示次数或在网站上查找漏洞。

直到一年前,最流行的无头浏览器之一就是PhantomJS。由于它基于Qt框架构建,因此与大多数流行的浏览器相比,它表现出许多差异。使用某些浏览器指纹技术可以检测到PhantomJS。从59版开始,Google推出了无头版本的Chrome浏览器。与PhantomJS不同,它基于香草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 viewer
    Google Native Client
    。相反,在无头模式下,返回的数组 包含插件。

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

      }

  • 语言 :在Chrome中两个Javascript属性使获得由所使用的语言

    user: navigator.language
    navigator.languages
    。第一个是浏览器UI的语言,而第二个是代表用户首选语言的字符串数组。但是,在无头模式下,
    navigator.languages
    将返回一个 字符串。

    • 可以通过以下方法检查 语言 是否存在:
          if(navigator.languages == "") { console.log("Chrome headless detected");

      }

  • WebGL :WebGL是用于在HTML画布中执行3D渲染的API。使用此API,可以查询图形驱动程序的供应商以及图形驱动程序的渲染器。使用普通的Chrome和Linux,我们可以获得渲染器和供应商的以下值:

    Google SwiftShader
    Google 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”);
      }
      }

这些是为什么无头浏览器更容易被检测到的一些关键因素。




欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4901675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存