从爬虫的攻防角度来讲,最简单的爬虫,是几乎所有服务端、客户端编程语言都支持的http请求,只要向目标页面的url发起一个http get请求,即可获得到浏览器加载这个页面时的完整html文档,这被我们称之为“同步页”。
本文首发于我的个人博客,同步发布于cnode社区,非商业转载请注明出处,商业转载请阅读原文链接里的法律声明。
从爬虫的攻防角度来讲
基于客户端js运行时的检测
基于plugin对象的检查
if(navigator.plugins.length === 0) {
console.log('It may be Chrome headless');
}
基于language的检查
if(navigator.languages === '') {
console.log('Chrome headless detected');
}
基于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');
}
}
var fakeAlert = (function(){}).bind(null);
console.log(window.alert.toString()); // function alert() { [native code] }
console.log(fakeAlert.toString()); // function () { [native code] }
反爬虫的银弹
机器人协议
写在最后