python3 + webdriver, page_source无法获取源码等问题

在尝试抓取某眼查,配置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");
}

如果能规避以上几种检测, 相信次问题将会迎刃而解.

前端的检测方法来源于: 某位大佬

你可能感兴趣的:(selenium,python,webdriver)