JS `Anti-Bot` 机制识别与绕过:指纹识别、行为分析与 Honeypot

各位老铁,大家好!我是今天的主讲人,咱今天聊聊JS反爬虫里的那些弯弯绕绕,也就是JS Anti-Bot 机制,重点说说指纹识别、行为分析和 Honeypot 这三大块。保证大家听完之后,下次遇到这些幺蛾子,心里有数,也能抄家伙(代码)干它一炮!

一、开胃小菜:反爬虫是个啥?

简单来说,反爬虫就是网站为了保护自己的数据不被大规模、恶意地抓取,而采取的一系列技术手段。你想啊,辛辛苦苦攒的数据,让别人轻轻松松就拿走了,搁谁心里也不舒服。

JS 反爬虫,顾名思义,就是利用 JavaScript 来实现的反爬虫策略。因为 JS 运行在用户的浏览器里,所以可以获取到很多浏览器环境的信息,这些信息可以用来判断你是不是一个“正常”的用户,还是一个偷偷摸摸的“爬虫”。

二、指纹识别:你是谁?从哪儿来?

指纹识别,顾名思义,就是给浏览器打上一个“指纹”,这个指纹包含了浏览器的各种信息,比如:

  • User-Agent: 这个大家应该都熟悉,表面上是告诉服务器你是啥浏览器,但实际上可以伪造。
  • 屏幕分辨率: screen.widthscreen.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-extrapuppeteer-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 仔细分析页面结构,忽略隐藏元素,使用浏览器渲染引擎。

记住一点,反爬虫和反反爬虫是一场永无止境的猫鼠游戏,双方都在不断进化。我们需要做的,就是不断学习新的技术,才能在这场游戏中占据优势。

今天就讲到这里,希望对大家有所帮助。下次再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注