|
基于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');
- }
基于浏览器hairline特性的检查
- if(!Modernizr['hairline']) {
- console.log('It may be Chrome headless');
- }
基于错误img src属性生成的img对象的检查
- 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');
- }
- }
基于以上的一些浏览器特性的判断,基本可以通杀市面上大多数 Headless Browser 程序。在这一层面上,实际上是将网页抓取的门槛提高,要求编写爬虫程序的开发者不得不修改浏览器内核的C++代码,重新编译一个浏览器,并且,以上几点特征是对浏览器内核的改动其实并不小,如果你曾尝试过编译Blink内核或Gecko内核你会明白这对于一个“脚本小子”来说有多难~
更进一步,我们还可以基于浏览器的 UserAgent 字段描述的浏览器品牌、版本型号信息,对js运行时、DOM和BOM的各个原生对象的属性及方法进行检验,观察其特征是否符合该版本的浏览器所应具备的特征。
这种方式被称为 浏览器指纹检查 技术,依托于大型web站对各型号浏览器api信息的收集。而作为编写爬虫程序的进攻一方,则可以在 Headless Browser 运行时里预注入一些js逻辑,伪造浏览器的特征。
另外,在研究浏览器端利用js api进行 Robots Browser Detect 时,我们发现了一个有趣的小技巧,你可以把一个预注入的js函数,伪装成一个Native Function,来看看下面代码:
- var fakeAlert = (function(){}).bind(null);
- console.log(window.alert.toString()); // function alert() { [native code] }
- console.log(fakeAlert.toString()); // function () { [native code] }
(编辑:PHP编程网 - 湛江站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|