在尝试抓取某眼查,配置chrome options时候,如果添加了headless则拿不到源码.而不加就可以.
不加(无头模式)的源码:
403 Forbidden
403 Forbidden
You don't have permission to access the URL on this server.
Powered by Tengine
除去 User-Agent/Cookie/Referer等一些常规检测外
第一种: 直接对headless判断.
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");
}
第三种: 语言判断
在谷歌浏览器里,有两个JavaScript属性可以获取当前浏览器的语言设置: navigator.language 和 navigator.languages。头一个是指浏览器界面的语言,后一个返回的是个数组,里面存储的是浏览器用户的所有次选语言。然而,在无头模式里,navigator.languages 返回的是个空字符串。
if(navigator.languages == "") {
console.log("Chrome headless detected");
}
第四种: WebGL 对照
WebGL 提供了一组能在HTML canvas 里执行3D渲染的API。通过这些API,我们可以查询出图形驱动的 vendor 和 renderer 。 在linux上的普通谷歌浏览器里,我们获得的 renderer 和 vendor 值为: “Google SwiftShader” 和 “Google Inc.”。 而在无头模式里,我们获得的一个是 “Mesa OffScreen”——它是没有使用任何 window 系统的渲染技术的名称,和 “Brian Paul” ——开源 Mesa 图形库的最初的程序。并不是所有版本的无头浏览器都有同样的这两个值。然而目前在无头浏览器里是“Mesa Offscreen” 和 “Brian Paul” 这两个值。
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");
}
第五种: 浏览器检测
Modernizr 可以探测出当前浏览器对HTML和CSS各种特性的支持程度。普遍的,无头模式下Chrome没有 hairline 特征。
if(!Modernizr["hairline"]) {
console.log("It may be Chrome headless");
}
如果能规避以上几种检测, 相信次问题将会迎刃而解.
前端的检测方法来源于: 某位大佬