判断过滤爬虫后加载js脚本
初级版
<script>
判断是否是爬虫
(function() {
// 常见爬虫UA特征正则匹配
const isSpider = /bot|crawl|spider|google|baidu|bing|msn|teoma|slurp|yandex|curl|Sogou|Baiduspider|YisouSpider|360Spider|Bytespider|Spider|wget/i.test(navigator.userAgent);
// 仅真实用户浏览器执行插入
if (!isSpider) {
//开始
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?b945c7adc808280df3a3f1d14917a66d";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?e09ce678413e2592a1b7155a1a2640f7";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
//结束
}
})();
</script>
进阶版:
针对 Selenium 等自动化工具进行优化,可以增加一些检测手段来识别和防止自动化脚本(包括爬虫或机器人)加载 JavaScript 代码。Selenium 等自动化工具通常会模仿用户行为,但它们的行为仍然可以通过某些技术被识别。以下是进一步优化的代码,旨在提高对 Selenium 等自动化工具的检测能力:
- 检测 navigator 属性的异常
Selenium 和其他自动化工具可能会修改 navigator 对象,或者它们会有一些异常的属性。这些属性可能在真实浏览器中不可用。通过检测这些异常,可以识别自动化工具。
例如,检测 navigator.webdriver 属性,这个属性是 Selenium 使用时通常存在的,但正常的浏览器没有这个属性。
-
检测特定的 window 属性
Selenium 和其他自动化工具可能会在 window 对象上添加一些特殊属性或方法。你可以利用这些特殊行为进行识别。 -
模拟特定的用户行为
可以通过更复杂的行为检测,例如模拟拖动滑块、模拟连续的鼠标移动、或者用某些特定的动画来进一步测试用户是否是真人。 -
结合时间和请求频率分析
Selenium 和其他自动化工具往往具有较快的页面加载速度,以及对某些页面的重复访问。这些特征可以帮助识别自动化工具。
<script>
// 用户行为检测
let userIsHuman = false;
document.addEventListener('mousemove', () => {
userIsHuman = true;
});
document.addEventListener('click', () => {
userIsHuman = true;
});
// User-Agent 排除
const isSpider = /bot|crawl|spider|google|baidu|bing|msn|teoma|slurp|yandex|curl|Sogou|Baiduspider|YisouSpider|360Spider|Bytespider|Spider|wget/i.test(navigator.userAgent);
// 延迟加载
setTimeout(() => {
if (!isSpider && userIsHuman) {
// 执行JS代码
console.log('JS code executed,当前非爬虫环境');
//开始
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?b945c7adc808280df3a3f1d14917a66d";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?e09ce678413e2592a1b7155a1a2640f7";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
//结束
}
}, 3000); // 等待3秒
</script>
高级版:
<script>
(function() {
// 综合检测函数
function isHuman() {
// 基础检测
const checks = {
// WebDriver特性检测
webdriver: navigator.webdriver === undefined,
// 插件检测(正常浏览器至少有4个插件)
plugins: navigator.plugins.length > 3,
// 语言检测
languages: navigator.languages && navigator.languages.length > 0,
// 屏幕色彩深度检测
colorDepth: screen.colorDepth > 24,
// 触屏事件支持检测
touchSupport: 'ontouchstart' in window || navigator.maxTouchPoints > 0,
// 无效属性检测
chrome: !window.chrome || (window.chrome && !window.chrome.runtime),
// 权限API检测
permissions: navigator.permissions && navigator.permissions.query instanceof Function,
// 错误触发检测
errorTrigger: (() => {
try {
const originalToString = Function.prototype.toString;
Function.prototype.toString = function() {
if (this === navigator.constructor.prototype.webdriver) {
return "function webdriver() { [native code] }";
}
return originalToString.call(this);
};
return (navigator.constructor.prototype.webdriver !== undefined);
} catch (e) {
return false;
}
})()
};
// 计算通过率(至少通过80%的检测项)
const passed = Object.values(checks).filter(v => v).length;
const passRate = passed / Object.keys(checks).length;
return passRate >= 0.8;
}
// 用户行为检测
function waitForInteraction(callback) {
let interacted = false;
const events = ['mousemove', 'scroll', 'keydown', 'click'];
const handler = () => {
if (!interacted) {
interacted = true;
events.forEach(evt => window.removeEventListener(evt, handler));
callback();
}
};
events.forEach(evt => window.addEventListener(evt, handler, { once: true }));
// 10秒超时机制
setTimeout(() => {
if (!interacted) {
// 无交互时根据基础检测结果决定
if (isHuman()) callback();
}
}, 10000);
}
// 动态加载JS
function loadJS() {
const script = document.createElement('script');
script.src = 'your-script.js';
script.async = true;
document.head.appendChild(script);
}
// 主流程
if (isHuman()) {
waitForInteraction(loadJS);
} else {
// 二次验证机会
setTimeout(() => {
if (isHuman()) loadJS();
}, 5000);
}
})();
</script>
高级版实现原理:
-
基础环境检测:
- WebDriver属性检测(Selenium等工具特征)
- 浏览器插件数量检测(自动化工具通常插件较少)
- 屏幕色彩深度检测(真实设备通常高于24位)
- 权限API检测(自动化工具可能缺失)
- 通过原型链检测属性篡改
-
用户行为验证:
- 等待至少一次用户交互(鼠标移动、滚动等)
- 设置10秒超时机制(兼顾无交互用户)
- 二次验证机会防止误判
-
防御增强措施:
- 动态属性检测(防止单一特征检测被绕过)
- 多重条件综合判断(通过率阈值机制)
- 异步加载机制(增加逆向分析难度)
注意事项:
-
需要根据实际业务场景调整:
- 修改检测阈值(passRate)
- 调整超时时间
- 增减检测项目
-
以下情况可能影响检测效果:
- 旧版本浏览器
- 特殊隐私设置的浏览器
- 高度定制的自动化工具
-
推荐配合以下措施增强效果:
- 重要操作增加验证码
- 关键接口实施频率限制
- 用户行为模式分析
此方案通过环境特征检测结合用户行为验证,能够在不需要第三方服务的情况下有效识别大多数自动化工具。但需注意没有任何方案能100%防御所有自动化工具,建议定期更新检测策略。