开源 作者:云助手 2025-04-10 12:09:37 阅读:28
随着互联网的迅猛发展,爬虫技术成为数据抓取的重要工具。然而,恶意爬虫的出现给网站带来了不少问题,例如数据泄露、服务器负载过高等。
为了应对这一挑战,Anubis 提出了基于 工作量证明(Proof-of-Work, PoW) 的创新反爬机制。
本文将详细解析 Anubis 的底层实现原理,并通过量化数据探讨其计算耗时。
Anubis 的基本原理非常简单但高效:
• 计算任务: 访问者在访问网站前,必须完成一个计算密集型的哈希计算任务。
• 计算条件: 只有计算出符合特定条件的哈希值,才能继续访问网站。
• 爬虫难度: 由于计算过程需要 JavaScript 执行,传统的无头爬虫或 HTTP 客户端难以完成。
这一机制类似于比特币等区块链中的 PoW 机制,确保每次访问都需要消耗一定的计算资源,从而有效地提高恶意爬虫的抓取成本。
2.1 反向代理拦截
Anubis 充当反向代理服务器,拦截并转发所有访问目标网站的请求。
工作流程如下:
拦截请求: 用户访问目标网站时,Anubis 服务器首先拦截请求,并返回一个包含 PoW 计算任务的 JavaScript 代码。
计算任务: 用户需要在浏览器中执行 JavaScript 来完成 PoW 任务。
验证计算: 一旦计算完成,浏览器将计算结果发送回 Anubis 服务器,服务器验证计算是否符合要求。
2.2 计算 PoW 任务
浏览器需要计算一个符合难度要求的 SHA-256 哈希值。
具体的计算过程如下:
function computePoW(prefix, difficulty) { let nonce = 0; while (true) { let hash = sha256(prefix + nonce); if (hash.startsWith('0'.repeat(difficulty))) { return nonce; } nonce++; }}
• prefix 是由服务器随机生成的,确保每次挑战唯一。
• difficulty 表示要求哈希值前若干位为 0(例如,前 5 位为 0)。
• 计算过程中,nonce 值需要经过多次迭代,直到找到满足条件的哈希值。
2.3 验证计算结果
计算完成后,浏览器将 nonce 返回给 Anubis 服务器。服务器验证 sha256(prefix + nonce) 是否符合难度要求。如果验证通过,Anubis 服务器设置 Cookie 允许用户访问目标网站。
2.4 维持访问状态
为了避免用户每次访问都重新计算,Anubis 服务器会在验证成功后返回一个短期有效的 Cookie。用户在 Cookie 有效期内,无需再次进行 PoW 计算,直接访问目标网站。
Anubis 利用 PoW 机制对抗爬虫,具有以下优势:
显著增加爬虫成本: 传统爬虫通常是批量并发抓取,PoW 要求每个请求都进行计算,极大降低了爬取效率。
对普通用户影响较小: 计算任务仅在首次访问或 Cookie 过期后触发,普通用户可以快速完成计算,不影响正常体验。
有效对抗无头浏览器: 无头浏览器虽然能够执行 JavaScript,但 PoW 的计算仍消耗大量 CPU 资源。由于 PoW 计算是动态生成的,缓存无效,爬虫无法绕过挑战。
要量化 Anubis 的计算耗时,可以从两个方面来衡量:
4.1 计算哈希的时间
每次计算 SHA-256 哈希时,根据挑战(challenge)和 nonce 进行迭代运算,直到满足特定条件。以下是模拟计算时间的代码示例:
const start = Date.now(); // 记录开始时间let nonce = 1;let challenge = "some_challenge_data"; // 这是请求中生成的挑战let validHash = false;while (!validHash) {const hash = awaitsha256(`${challenge}${nonce}`); validHash = hash.startsWith("00000"); // 默认要求前5位为0 nonce++;}const end = Date.now(); // 记录结束时间const elapsedTime = end - start; // 计算耗时console.log(`哈希计算总耗时: ${elapsedTime} 毫秒`);
通过记录开始时间 start 和结束时间 end,可以计算出每次哈希计算所消耗的时间。这个耗时是计算效率的关键指标,反映了 PoW 任务的计算难度。
4.2 测量实际测试耗时
我们还可以通过模拟用户请求,记录整个过程的耗时,得到一个综合的性能数据。包括:
页面加载时间: 用户访问 Anubis 代理服务器后,页面加载的时间。
哈希计算时间: 执行 PoW 计算所需的时间。
请求完成时间: 用户通过验证后,重定向到目标网站的时间。
以下是模拟完整过程的代码示例:
<!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PoW 计算测试</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js"></script><!-- 引入 sha256 库 --></head><body> <h1>PoW 计算测试</h1> <button onclick="startPoW()">开始计算</button> <div class="output" id="output"> <p id="iterations">迭代次数:等待计算</p> <p id="timeElapsed">耗时:等待计算</p> </div> <script> asyncfunctionstartPoW() { const startRequest = Date.now(); // 请求开始时间 // 假设计算过程是之前的步骤 let nonce = 1; let challenge = "some_challenge_data"; // 这是请求中生成的挑战 let validHash = false; let iterations = 0; // 记录迭代次数 // 计算 SHA256 while (!validHash) { const hash = CryptoJS.SHA256(challenge + nonce).toString(CryptoJS.enc.Hex); validHash = hash.startsWith("00000"); nonce++; iterations++; // 每次循环增加迭代次数 } const endRequest = Date.now(); // 请求结束时间 const requestElapsedTime = endRequest - startRequest; // 更新 UI 输出 document.getElementById('iterations').textContent = `迭代次数:${iterations}`; document.getElementById('timeElapsed').textContent = `耗时:${requestElapsedTime} 毫秒`; } </script></body></html>
通过测量完整请求的耗时,我们能够更全面地了解 Anubis 反爬机制的性能。
通过多次测试,我们可以得出每次迭代的平均耗时以及总耗时。例如:
这些数据帮助我们量化 Anubis 的防止爬虫效果,并为网站管理员提供了依据,可以在不同难度条件下优化 PoW 计算,确保对爬虫的有效防护,同时保证正常用户的体验不受影响。
Anubis 通过 PoW 机制,将爬虫的计算成本大幅提高,极大地阻碍了恶意爬虫的抓取效率。而普通用户则几乎不会受到影响,确保了正常浏览体验。这种创新的防护方法在与传统反爬方式(如验证码、IP 限制等)相比,具有更强的适应性和防护能力。
通过量化计算耗时,站点管理员可以实时监控和调整 PoW 难度,优化防护策略,以实现更高效、更智能的反爬机制。
引用链接
[1] 源码下载 :https://pan.baidu.com/s/15DGvtSLSZLezFOJmg8jtTg?pwd=n6c8