selenium chromedriver 无头浏览器检测

JS常用的检测无头浏览器的方法

   1.User-Agent: 最常见的一种判断无头浏览器的方法。

      检查User-Agent。在linux计算机里  Chrome Version 59 无头浏览器的UserAgent 的值是:

      “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/59.0.3071.115 Safari/537.36”

       于是,检查是否是无头Chrome浏览器:

        # 判断‘HeadlessChrome’字符串是否包含在UserAgent中     

  if (/HeadlessChrome/.test(window.navigator.userAgent)) {

          console.log("chrome headless detected");

          }

      解决方法:

      

{"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"}

  注: User Agent 也可以从HTTP headers 里获取。然而,这两种情况都容易伪造

 

  2. 插件 Plugins

       navigator.plugins 会返回一个数组,里面是当前浏览器的插件信息。通常,普通Chrome浏览器

       有一些缺省插件,比如Chrome PDF viewer 或 Google Native Client. 相反,在无头模式里,没有

       任何插件,返回的是个空数组。     

  if (navigator.plugins.length == 0) {

         console.log("It may be Chrome headless")

         }

    解决办法:

navigator.plugins=[1,2,3,4,5]  # 方法1
navigator.plugins || [1,2,3,4,5]  # 方法2

   注:也可以替换最终的赋予值(根据实际环境)  

3. 语言

      在谷歌浏览器里,有两个JavaScript属性可以获取当前浏览器的语言设置:

      navigator.language 和 navigator.languages。 第一个是指浏览器界面的语言,后一个返回的是一个数组,

      里面存储的是浏览器用户的所有次选语言。然而,在无头模式里,navigator.languages返回的是个

      空字符串

navigator.language="zh-CN"

   4.  WebGL

        WebGL 提供了一组能在HTML canvas里执行3D渲染的APO.通过这些API.我们可以查询出图形驱动

        的vendor 和 render。

       在 Linux 上的普通谷歌浏览器里,我们获得的renderer 和 vendor 的值为: ‘Google SwiftShader’

       和 ‘Google Inc.’。

       在无头模式里,,我们获得的一个是 ‘MesaOffScreen’ --- 他是没有使用任何 window 系统的

       渲染技术的名称, 和‘ Brian Paul’ ---开源Mesa 图形库的最初的程序。

      var canvas = document.create.createElement('canvas');

      var gl = canvas.getContext('webgl')

      var debugInfo = gl.getExtension('WEBGL_debug_render_info');

      var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);

      var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);

      if (vendor == 'Brian Pual'  && renderer == "Mesa offScreen") {

         console.log("chrome headless detected");

       }

     注: 并不是所有版本的无头浏览器都有同样的这两个值。然而目前在无头浏览器里是 “MesaOffscreen”

     和 “Brian Pual” 这两个值。

   5. 浏览器特征: Modernizr 可以探测出当前浏览器对HTML和CSS各种特性的支持程度。我发现,普通

       Chrome 和 无头Chrome里唯一的区别是,无头模式下没有hairline特征。 他是用来检测是否支持

       hidpi/retina hairlines的

   6. 加载失败的图片

       检查切入点是检查浏览器不能正常加载图片的宽和高。

       在正常的Chrome里面,未成功加载的图片跟浏览器的zoom有关,但肯定不是零。

       而在无头浏览器里,这中图片的宽和高都是0。

      var body = document.getElementsByTagName("body")[0];

      var image = document.createElement("img");

      image.src = "http://iloveponeydotcom32188.jg";

      image.setAtturibute("id","fakeimage");

      body.appendChild(image);

      image.onerror = function(){

      if (image.width == 0 && image.height == 0){

           console.log(chrome headless detected);

           }

      }

image.length=100;  # 可以使用mitmproxy 在代码中进行替换,为图片指定宽高
image.width=100;

    原文地址: http://www.webhek.com/post/detecting-chrome-headless.html

 

 

   

你可能感兴趣的:(爬虫学习)