各位老铁,大家好!我是今天的主讲人,咱今天聊聊JS反爬虫里的那些弯弯绕绕,也就是JS Anti-Bot
机制,重点说说指纹识别、行为分析和 Honeypot 这三大块。保证大家听完之后,下次遇到这些幺蛾子,心里有数,也能抄家伙(代码)干它一炮!
一、开胃小菜:反爬虫是个啥?
简单来说,反爬虫就是网站为了保护自己的数据不被大规模、恶意地抓取,而采取的一系列技术手段。你想啊,辛辛苦苦攒的数据,让别人轻轻松松就拿走了,搁谁心里也不舒服。
JS 反爬虫,顾名思义,就是利用 JavaScript 来实现的反爬虫策略。因为 JS 运行在用户的浏览器里,所以可以获取到很多浏览器环境的信息,这些信息可以用来判断你是不是一个“正常”的用户,还是一个偷偷摸摸的“爬虫”。
二、指纹识别:你是谁?从哪儿来?
指纹识别,顾名思义,就是给浏览器打上一个“指纹”,这个指纹包含了浏览器的各种信息,比如:
- User-Agent: 这个大家应该都熟悉,表面上是告诉服务器你是啥浏览器,但实际上可以伪造。
- 屏幕分辨率:
screen.width
和screen.height
。 - 操作系统:
navigator.platform
。 - 浏览器插件:
navigator.plugins
。 - 字体: 通过 JS 检测浏览器支持哪些字体。
- WebGL 信息: 通过 WebGL API 获取显卡信息。
- Canvas 指纹: 利用 Canvas 绘制一张图片,然后获取图片的哈希值,不同的浏览器和操作系统渲染出来的图片可能会有细微差别。
代码示例:Canvas 指纹
function getCanvasFingerprint() {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const txt = 'abcdefghijklmnopqrstuvwxyz0123456789';
ctx.textBaseline = "top";
ctx.font = "14px 'Arial'";
ctx.textBaseline = "alphabetic";
ctx.fillStyle = "#f60";
ctx.fillRect(125,1,62,20);
ctx.fillStyle = "#069";
ctx.fillText(txt, 2, 15);
ctx.fillStyle = "rgba(102, 204, 0, 0.7)";
ctx.fillText(txt, 4, 17);
const fingerprint = canvas.toDataURL("image/png");
return fingerprint;
}
const canvasFingerprint = getCanvasFingerprint();
console.log("Canvas 指纹:", canvasFingerprint);
这段代码会生成一个 Canvas 指纹,每次运行的结果可能都会不一样,因为浏览器的渲染引擎、操作系统、显卡驱动等因素都会影响 Canvas 的渲染结果。
绕过方法:
- User-Agent: 伪造一个真实的 User-Agent。
- Headless Chrome 检测: 有些网站会检测你是否使用了 Headless Chrome (无头浏览器),可以通过修改
navigator
对象来绕过。 - 指纹混淆: 使用一些工具来随机化浏览器的指纹,比如
puppeteer-extra-plugin-stealth
。
代码示例:使用 puppeteer-extra-plugin-stealth
绕过 Headless Chrome 检测
首先,安装 puppeteer-extra
和 puppeteer-extra-plugin-stealth
:
npm install puppeteer-extra puppeteer-extra-plugin-stealth
然后,编写代码:
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://bot.sannysoft.com/'); // 一个专门用来测试 bot 检测的网站
await page.waitForTimeout(5000); // 等待 5 秒钟,让页面加载完成
await page.screenshot({ path: 'stealth.png' });
await browser.close();
})();
这段代码使用了 puppeteer-extra-plugin-stealth
插件,它可以自动修改浏览器的指纹,绕过一些常见的 Headless Chrome 检测。
三、行为分析:你像不像人?
行为分析,就是通过分析用户的行为模式,来判断你是不是一个真人。比如:
- 鼠标移动轨迹: 真人操作鼠标的轨迹通常是不规则的,而爬虫的鼠标移动轨迹可能是直线或者简单的曲线。
- 键盘输入速度: 真人打字的速度通常是比较慢的,而且会有停顿,而爬虫可能会以非常快的速度输入内容。
- 页面交互: 真人会在页面上进行各种交互,比如点击、滚动、拖拽等,而爬虫可能只会加载页面,然后提取数据。
- 停留时间: 真人在页面上停留的时间通常是比较长的,而爬虫可能会很快地访问大量的页面。
代码示例:模拟鼠标移动轨迹
async function simulateMouseMove(page, startX, startY, endX, endY, duration) {
const steps = 20; // 模拟的步数
const sleepTime = duration / steps; // 每一步的间隔时间
for (let i = 1; i <= steps; i++) {
const currentX = startX + (endX - startX) * (i / steps);
const currentY = startY + (endY - startY) * (i / steps);
await page.mouse.move(currentX, currentY);
await page.waitForTimeout(sleepTime);
}
}
// 使用示例
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
// 获取元素的位置
const element = await page.$('body');
const boundingBox = await element.boundingBox();
const startX = boundingBox.x + boundingBox.width / 2;
const startY = boundingBox.y + boundingBox.height / 2;
// 模拟鼠标移动到 (100, 100) 的位置,耗时 500 毫秒
await simulateMouseMove(page, startX, startY, 100, 100, 500);
await browser.close();
})();
这段代码可以模拟鼠标从一个位置移动到另一个位置,并且可以控制移动的速度和轨迹。
绕过方法:
- 模拟真人行为: 尽可能地模拟真人的行为模式,比如随机的鼠标移动轨迹、键盘输入速度、页面交互等。
- 使用代理 IP: 避免使用同一个 IP 地址频繁地访问网站,可以使用代理 IP 来分散请求。
- 控制访问频率: 不要以非常快的速度访问网站,可以适当的控制访问频率。
四、Honeypot:瓮中捉鳖?
Honeypot,也就是“蜜罐”,是一种诱饵技术。网站会在页面上放置一些隐藏的链接或者表单,这些链接或者表单对于正常用户来说是不可见的,但是爬虫可能会误入其中。一旦爬虫访问了这些链接或者提交了表单,网站就可以判断它是一个爬虫,并采取相应的反爬虫措施。
代码示例:一个简单的 Honeypot
<!DOCTYPE html>
<html>
<head>
<title>Honeypot Example</title>
<style>
.honeypot {
display: none; /* 隐藏 Honeypot */
}
</style>
</head>
<body>
<h1>Welcome!</h1>
<form>
<label for="name">Name:</label>
<input type="text" id="name" name="name"><br><br>
<label for="email">Email:</label>
<input type="email" id="email" name="email"><br><br>
<label for="honeypot" class="honeypot">Leave this field blank:</label>
<input type="text" id="honeypot" name="honeypot" class="honeypot"><br><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
在这个例子中,honeypot
字段被隐藏起来了,正常用户是看不到的。但是,一些简单的爬虫可能会自动填充所有的表单字段,包括 honeypot
字段。如果网站检测到 honeypot
字段被填写了,就可以判断它是一个爬虫。
绕过方法:
- 仔细分析页面结构: 在抓取页面之前,仔细分析页面结构,避免访问隐藏的链接或者表单。
- 忽略隐藏元素: 在抓取页面时,忽略
display: none
或者visibility: hidden
的元素。 - 使用浏览器渲染引擎: 使用浏览器渲染引擎来渲染页面,这样可以更好地模拟真人的行为,并且可以避免访问隐藏的链接或者表单。
五、总结:道高一尺,魔高一丈
JS 反爬虫技术在不断发展,绕过反爬虫的难度也在不断增加。但是,只要我们掌握了反爬虫的原理,并且不断学习新的技术,就一定可以绕过反爬虫的限制,获取到我们需要的数据。
反爬虫手段 | 绕过方法 |
---|---|
指纹识别 | 伪造 User-Agent,修改 navigator 对象,使用指纹混淆工具(如 puppeteer-extra-plugin-stealth )。 |
行为分析 | 模拟真人行为(随机鼠标移动轨迹、键盘输入速度、页面交互),使用代理 IP,控制访问频率。 |
Honeypot | 仔细分析页面结构,忽略隐藏元素,使用浏览器渲染引擎。 |
记住一点,反爬虫和反反爬虫是一场永无止境的猫鼠游戏,双方都在不断进化。我们需要做的,就是不断学习新的技术,才能在这场游戏中占据优势。
今天就讲到这里,希望对大家有所帮助。下次再见!