如何识别机器人检测陷阱并避开它们

2026/2/27

如何识别机器人检测陷阱并避开它们
Markus_automation
Markus_automation

Expert in data parsing and automation

自动化抓取已成为许多项目的重要组成部分:价格监测、数据收集和社交媒体分析。然而,网站所有者试图保护他们的数据并减少服务器负载,因此他们不鼓励抓取。虽然他们无法简单地禁止抓取他们的网站或服务,但他们可以设置特殊的陷阱,以帮助确定访问者是人类还是脚本。在这篇文章中,我们研究了网站用来检测机器人的最常见技术,以及识别和绕过这些陷阱的方法。

内容

自动化抓取已成为许多项目的重要组成部分:价格监控、数据收集和社交媒体分析。然而,网站所有者试图保护他们的数据并减少服务器负载,因此他们不鼓励抓取。虽然他们不能简单地禁止抓取他们的网站或服务,但他们可以设置特殊的陷阱来帮助确定访客是人还是脚本。在本文中,我们将研究网站用于检测机器人的最常见技术,以及识别和绕过这些陷阱的方法。

隐形诱捕陷阱:隐藏链接和字段

最常用来捕捉机器人的技巧之一是所谓的诱捕字段——专门准备和隐藏的页面元素。真人永远不会看到或点击它们,但简单的机器人可能会。

Invisible honeypot traps

一个基本的例子是一个看不见的链接(通过CSS样式创建,如display: none或定位在屏幕外),它会引导到一个特殊的陷阱URL。普通用户不会点击这样的链接,因为他们甚至不知道它的存在,但系统抓取器会系统地爬过每个链接并跟随它并暴露自己。一旦脚本加载了该页面,服务器就可以将其IP地址添加到黑名单并阻止进一步访问。

Invisible honeypot traps

类似的想法适用于网络表单。隐藏的字段被添加到表单中(例如注册或联系表单)。人类看不到它,但机器人可能会找到并填写它。这样的诱捕字段表明机器人活动。如果提交的表单在隐藏字段中包含文本,那就是一个红色标志。请求被拒绝或会话被标记为机器人流量。在任何情况下,进一步的工作都变得不可能。

如何避免:首先,在抓取页面时,分析元素属性在单击或导航之前。检查链接样式:如果链接或按钮被标记为不可见(display:noneopacity: 0、大小为1×1像素等),则忽略它。类似地,在提交表单之前,确保您没有填写任何隐藏字段(它们可以通过不寻常的名称或属性识别,例如aria-hiddentabindex="-1"、隐藏样式等)。初学者可能认为这些细节无足轻重,但这是最容易被检测到的方法之一。一个不必要的点击陷阱链接就足以暴露您的机器人。

自然,网站和服务所有者了解对策,现代机器人已经可以通过可疑的CSS特征检测诱捕元素,因此这种方法通常与其他保护技术结合使用。不过,过滤看不见的链接和字段是任何专业解析器的强制性要求。

CAPTCHA 和 JavaScript 挑战

防止自动化访问的更明显方法是CAPTCHA,那些烦人的弹出窗口包含图像选择、“我不是机器人”复选框和类似的变化。这是区别于脚本或机器人的直接有效方法。与隐藏的诱捕装置不同,CAPTCHA 明确要求完成一个机器人预计无法解决的任务。在实践中,简单的 CAPTCHA 可以相对容易地绕过,因为存在许多免费的开源解决方案,而更复杂的则需要第三方解决服务。

Backlink Checker

如果机器人遇到 CAPTCHA,选项有限:要么通过第三方服务自动解决它,要么更改线程并切换到另一个配置文件。付费 CAPTCHA 解决方案减慢抓取并增加成本。另一种策略是尽量避免触发 CAPTCHA ——例如,通过降低请求强度以避免激活保护措施,或者使用搜索引擎缓存(如 Google Cache)获取数据。

一个独立类别是JavaScript 挑战。许多网站(尤其是那些在 CDN 保护后面的网站)可能会在流量看起来可疑时返回验证页面而不是内容。该页面运行客户端 JS 代码以计算令牌、检查浏览器环境、设置 cookie,然后将访客重定向到实际内容。目的是确认请求来自支持 JS 的真正浏览器而不是简单的 HTTP 客户端。无法执行 JavaScript 的机器人将无法通过测试并无法访问。

如何避免:如果知道目标网站显示 CAPTCHA,请提前决定如何技术上和财务上绕过它们。如果无法防止 CAPTCHA(某些网站默认显示),您将需要集成第三方解决方案。对于 JS 挑战,最明显的解决方法是使用无界面浏览器来执行所需场景。流行的自动化工具(Puppeteer、Playwright 等)允许在后台运行浏览器,但不要忘记伪装,因为自动化痕迹必须始终隐藏。

忽略 JS 验证是不行的:如果存在,您必须通过它,否则您将无法获取数据。确保您的抓取器加载相关脚本、执行它们并存储用于后续请求的 cookie 或令牌。

行为分析:速度、顺序、交互

即使机器人绕过直接障碍,例如 CAPTCHA 和其他可见的反机器人方法,非人类行为模式仍可能是致命的。典型用户在产品页面上停留几秒钟,滚动,点击图片,然后继续导航。一个脚本可以立即加载页面并以完全可重复的顺序进行。现代网站跟踪此类异常。极高的导航速度、请求之间可疑的规则间隔和类似模式明显表明自动化。

另一个标志是异常导航顺序——例如,按字母顺序抓取 URL 或严格遵循站点地图,而这是普通访客很少做的。一个简单的指标是缺乏人性化的互动信号。如果日志显示一个会话查看了100个页面没有任何滚动或鼠标移动,则很可能是机器人流量。

也存在基于时间的陷阱。表单可能强制规定最短完成时间。大多数人花费至少5-10秒钟来输入凭证,而机器人可以在毫秒内提交。如果表单几乎瞬间提交,则自动化的可能性很高,网站可能会拒绝请求。类似的方法适用于导航:过快移动到下一步——尤其是支付这样复杂的步骤——在反机器人系统中引起怀疑。

如何避免:主要原则是模仿真实用户行为。在抓取器工作流程中引入随机性和自然模式。

首先,不要追求最大的抓取速度。如果速度不重要,以稍慢但更小心的方式工作更安全。在请求之间插入暂停——不是固定的,而是在一定范围内随机化。在每个页面上添加延迟以模拟阅读时间。

其次,避免严格的导航顺序。如果可能的话,在抓取顺序中引入随机性(例如,更改部分顺序或在页面上随机选择链接而不是按顺序迭代)。

第三,在无界面场景中添加自然交互的迹象。高级管道可能包括滚动、光标移动、打开界面元素和步骤之间的小暂停。这些动作不会直接影响数据收集,但会使工作流程更像人类,特别是在长页面和多步骤流程中(登录→选择→结算),一致的时间安排看起来不自然。

还要考虑网站的观点:许多系统将行为分析与遥测和网络分析结合。页面上的跟踪器可以记录交互事件和会话时间。如果日志显示没有典型信号的空会话,仅此一点就显得可疑。因此,重要的是不仅要评估抓取器的动作,还要评估会话数据实际生成的内容及其在监控方面的解释方式。

请求速率和体积限制

另一个用来区分机器与人的明显标准是请求频率。即使是最快的用户也无法每秒发送数十个请求,但脚本可以。这就是为什么实施服务器端限制:例如,每分钟来自单个 IP 的请求不超过 N 个。如果超过限制,则会触发临时或永久性封锁。在 Web 服务器或 CDN 级别,通过跟踪请求数量并过滤掉超过阈值的突发来实现。这取决于网站的政策:在某些地方每秒 5 个请求可能可以接受,而在其他地方,即使每秒 1 个请求也会被视为过多。这很容易实现:使用 Nginx,您可以配置每个 IP 每秒 1 个请求的限制,拒绝超过此限制的请求。

除了频率,还监控并发性。普通用户不太可能在不同标签中同时打开网站的 20 个页面,而抓取器可以轻松生成许多并行线程。这也会被跟踪:一个地址的太多同时会话足以怀疑是机器人网络或抓取器。

如何避免:首先,限制您脚本中的并发水平。是的,将目录抓取并行化为 50 个线程,并在一分钟内收集数据非常诱人,但在 99% 的情况下,这会立即引起不必要的关注。如果您看到网站对负载敏感,最好使用几个线程(甚至一个)工作。

其次,注意您的 IP 地址轮换。大多数网站记录每位访问者的 IP,并在检测到可疑活动时阻止整个地址。这就是为什么使用代理是认真抓取的标准做法。使用 IP 轮换是有意义的:在发送一定数量的请求或切换章节后,改变出口点地址。理想情况下,请始终使用住宅移动代理。配置抓取器时重要的是同一 IP 不要发出太多连续请求。例如,从一个地址发送不超过 5-10 个请求,然后切换。如果您的代理池有限,至少尝试交替使用它们并保持暂停。

此外,始终监测您的请求的响应头和状态代码。如果您开始接收到 HTTP 429 的“请求过多”或在页面内容中看到诸如“请求次数过多,请稍后再试”等内容,这是一个明确信号,表明请求限制已被触发。这种情况需要降低抓取速度、增加代理数量或使用其他技术。作为一种选择,如果限制是针对 IP 地址设置的,并且网站通过 HTTP 访问并允许在没有额外检查的情况下更改用户代理和引用者,轮换它们可能会有所帮助。

Error 1015

一般来说,主要规则是不突出:您越是无缝融入正常用户的背景流量中,您的抓取器就能在不被封锁的情况下运作更长时间。

头文件和浏览器指纹

网站可以通过分析请求参数的技术细节在连接阶段检测抓取器。每个 HTTP 请求都包含一组头文件(User-Agent、Accept、Accept-Language、Cookie 等),这些共同构成了浏览器配置文件。对于常规浏览器,这些配置文件是相当可预测的:例如,当使用 Chrome 访问网站时,您发送的头文件集具有特征,比如User-Agent: Mozilla/5.0 … Chrome/version …,加上支持语言列表(Accept-Language),获取标志(Sec-Fetch-* headers),等等。而机器人可能会发送不寻常或不完整的头文件集。许多网站立即屏蔽带有可疑用户代理字符串的请求,例如ScrapycurlWgetPython等,在防火墙级别。而即使您发送这样的字符串不被屏蔽,这个事实本身也会被视为总体风险得分的一部分。

即使替换为常见浏览器字符串,细节上也可能失败。例如,Headless Chrome 以前会暴露自己因为用户代理字符串包含“HeadlessChrome”一词。另一个例子:机器人不发送Accept-Language头文件(真正的浏览器总是发送语言偏好)。

另一个指标:头文件的顺序或其值与声明的浏览器不匹配。反机器人系统维护着大量浏览器指纹数据库 - 不同版本的 Chrome、Safari 和 Firefox 的不同头文件和值的模板。如果您假装是 Chrome 120+ 并发送相应的用户代理,但没有包含典型的现代 Chromium UA 客户端昵称头文件(Sec-CH-UASec-CH-UA-MobileSec-CH-UA-Platform),或者格式不正确,或由用户点击触发的导航请求不包含Sec-Fetch-User: ?1而其他Sec-Fetch-*头文件都在,可能会通过此类小的不一致之处暴露自动化(这只是一个说明性例子)。

此外,除了 HTTP 头文件,浏览器还可以通过navigator对象和 JS 环境暴露自己。无头模式通常包含一个navigator.webdriver属性,这对于自动化浏览器通常是true。然后网站可以运行一个小的客户端脚本:if (navigator.webdriver) { /* Bot detected */ } ——这个简单的方法足以抓住初学者。其他检查 Selenium 或 Playwright 留下的对象。例如,Playwright 在window中插入某些服务变量(__playwright__binding__等),页面上的脚本可以查找这些外部控制的迹象。

更高级的检查包包括Canvas API或WebGL测试,其中渲染一个隐藏图像并收集画布指纹,这可能匹配一个典型的模拟器签名。

简而言之,网站有许多可用的检查,环境伪装甚至可以通过 JS 实现中的小差异被检测到。

如何避免:尽可能地伪装成真实的设备/浏览器。始终设定与流行浏览器相对应的现实用户代理,并保持更新。但一个头文件不够:也要调整其他头文件。添加Accept-Language(考虑到 IP 区域)、Accept与常见浏览器的内容类型、ConnectionUpgrade-Insecure-RequestsSec-Fetch-*头文件等。最简单的方法是检查您的浏览器访问目标网站时发送的头文件(通过开发者工具或代理)并进行仿真。关注一致性:如果您声称自己是 Windows 上的 Chrome,您应该拥有面向 Windows 的用户代理,并在需要时添加一个Sec-CH-UA-Platform: "Windows"头文件。

如果您使用无头浏览器,请使用库或设置以自动启用自动化掩饰(例如,Puppeteer 有 puppeteer-extra-plugin-stealth 包,可禁用 navigator.webdriver 和其他暴露标志,或来自 rebrowser 的补丁版 playwright/puppeteer 隐藏这些库的许多标准弱点)。如果您创建低级抓取器,请通过DevTools Protocol手动修改navigator以设置与真实浏览器匹配的属性。

当然,无需模拟到绝对所有的随机 Canvas 噪音。最好的做法是从基础开始——头文件和简单的 JS。切勿发送明显可疑的字符串,定期更新头文件模板以匹配当前浏览器,启用小交互的仿真,并在可能的情况下,使用反检测工具测试您的机器人。工具如 BrowserScan 或 FingerprintJS 可以显示您的脚本暴露了哪些信号。

其他技巧:从“无限迷宫”到第三方服务

除了上述之外,还有更多值得了解的异国诱捕陷阱。一些资源故意创建“无限”的链接结构——对于抓取器来说是一种迷宫。

一个经典例子是动态生成的无尽日历页面或参数化的 URL,导致循环。没有适当停止条件的机器人可能会试图遍历无限的链接流而被困住。结果是浪费资源,并通过不寻常的行为向反机器人系统暴露自己。对于真实用户,这类链接通常无法到达,但机器人可能会掉入这样的陷阱。

如何避免:首先,始终分析收集的数据的合理性。如果您的抓取器突然跟随了一串链接进入不应该去的地方,并下载了看似随机短语的大量文本,您可能已经进入了迷宫。实现循环检测逻辑是有用的:跟踪访问过的 URL,限制抓取深度,验证新链接是否属于您需要的同一域或部分。

其次,始终考虑上下文:如果您抓取的例如是评论网站,而机器人突然开始下载明确不相关或不连贯的 AI 生成文本的页面,这是理由要小心并停止该会话。

也要记住第三方服务也帮助网站识别机器人。Cloudflare Bot Management、Datadome、PerimeterX 等产品专门检测自动流量。它们使用从行为分析和指纹识别到已知机器人的数据库甚至机器学习的一系列方法来识别不寻常的访问者。

如果您的机器人遇到强大的反机器人系统,任务会变得更复杂,因为检测可能基于小信号的组合。在这种情况下,上述讨论的所有内容都适用,您还需要考虑待抓取方的不断规则完善。有时限制请求量到不触发保护系统的水平或者更换抓取策略会更便宜。使用代理时,您可以尝试伪装成不同的真实用户,并且不仅更改 IP 地址,还要更改地理位置、用户代理和请求时间(模拟在一天中的不同时间访问,而非连续非停止活动)。

总结

如您所见,没有一个魔法按钮可以永久消除阻塞风险。成功的抓取需要技术方法和细致执行的组合:

  • 检测和忽略诱捕元素:在点击链接或填写字段之前,确保该元素没有从人类视野中隐藏。不要跟随可疑的 URL,也不要填写不可见的表单字段。

  • 模仿真实用户:使用典型普通浏览器的真实头文件和值(用户代理、Accept-Language 等)。尽可能将抓取通过反检测浏览器的浏览器内核运行,以通过 JS 检查并确保真实环境(navigator、cookies、localStorage 等)。

  • 限制速度和并发性:配置请求之间的延迟和暂停,使用随机化的间隔。不要超出请求限制,逐渐扩展,并监测网站反应(HTTP 429 代码、CAPTCHA 等)。

  • 轮换 IP 地址和会话标识符:使用代理或 VPN 池,交替 IP,特别是在大规模抓取时。确保单个 IP 使用频率不过高。始终首选住宅 IP,因为它们对反机器人系统来说不那么可疑。

  • 在抓取行为中引入随机性:模拟用户动作,例如,轻微的滚动、鼠标移动、阅读页面的时间。避免完全顺序的路线,并变换行动模式以不显示刚性算法。

网络抓取中的对抗仍在继续,随着网站发明新的检测方法,机器人开发者寻找规避的方法。在这场游戏中,赢家是更加细心和富有创造力的一方。让您的机器人正是这样:小心、灵活且人类地不可预测。

自动化抓取已成为许多项目的重要组成部分:价格监控、数据收集和社交媒体分析。然而,网站所有者试图保护他们的数据并减少服务器负载,因此他们不鼓励抓取。虽然他们不能简单地禁止抓取他们的网站或服务,但他们可以设置特殊的陷阱来帮助确定访客是人还是脚本。在本文中,我们将研究网站用于检测机器人的最常见技术,以及识别和绕过这些陷阱的方法。

隐形诱捕陷阱:隐藏链接和字段

最常用来捕捉机器人的技巧之一是所谓的诱捕字段——专门准备和隐藏的页面元素。真人永远不会看到或点击它们,但简单的机器人可能会。

Invisible honeypot traps

一个基本的例子是一个看不见的链接(通过CSS样式创建,如display: none或定位在屏幕外),它会引导到一个特殊的陷阱URL。普通用户不会点击这样的链接,因为他们甚至不知道它的存在,但系统抓取器会系统地爬过每个链接并跟随它并暴露自己。一旦脚本加载了该页面,服务器就可以将其IP地址添加到黑名单并阻止进一步访问。

Invisible honeypot traps

类似的想法适用于网络表单。隐藏的字段被添加到表单中(例如注册或联系表单)。人类看不到它,但机器人可能会找到并填写它。这样的诱捕字段表明机器人活动。如果提交的表单在隐藏字段中包含文本,那就是一个红色标志。请求被拒绝或会话被标记为机器人流量。在任何情况下,进一步的工作都变得不可能。

如何避免:首先,在抓取页面时,分析元素属性在单击或导航之前。检查链接样式:如果链接或按钮被标记为不可见(display:noneopacity: 0、大小为1×1像素等),则忽略它。类似地,在提交表单之前,确保您没有填写任何隐藏字段(它们可以通过不寻常的名称或属性识别,例如aria-hiddentabindex="-1"、隐藏样式等)。初学者可能认为这些细节无足轻重,但这是最容易被检测到的方法之一。一个不必要的点击陷阱链接就足以暴露您的机器人。

自然,网站和服务所有者了解对策,现代机器人已经可以通过可疑的CSS特征检测诱捕元素,因此这种方法通常与其他保护技术结合使用。不过,过滤看不见的链接和字段是任何专业解析器的强制性要求。

CAPTCHA 和 JavaScript 挑战

防止自动化访问的更明显方法是CAPTCHA,那些烦人的弹出窗口包含图像选择、“我不是机器人”复选框和类似的变化。这是区别于脚本或机器人的直接有效方法。与隐藏的诱捕装置不同,CAPTCHA 明确要求完成一个机器人预计无法解决的任务。在实践中,简单的 CAPTCHA 可以相对容易地绕过,因为存在许多免费的开源解决方案,而更复杂的则需要第三方解决服务。

Backlink Checker

如果机器人遇到 CAPTCHA,选项有限:要么通过第三方服务自动解决它,要么更改线程并切换到另一个配置文件。付费 CAPTCHA 解决方案减慢抓取并增加成本。另一种策略是尽量避免触发 CAPTCHA ——例如,通过降低请求强度以避免激活保护措施,或者使用搜索引擎缓存(如 Google Cache)获取数据。

一个独立类别是JavaScript 挑战。许多网站(尤其是那些在 CDN 保护后面的网站)可能会在流量看起来可疑时返回验证页面而不是内容。该页面运行客户端 JS 代码以计算令牌、检查浏览器环境、设置 cookie,然后将访客重定向到实际内容。目的是确认请求来自支持 JS 的真正浏览器而不是简单的 HTTP 客户端。无法执行 JavaScript 的机器人将无法通过测试并无法访问。

如何避免:如果知道目标网站显示 CAPTCHA,请提前决定如何技术上和财务上绕过它们。如果无法防止 CAPTCHA(某些网站默认显示),您将需要集成第三方解决方案。对于 JS 挑战,最明显的解决方法是使用无界面浏览器来执行所需场景。流行的自动化工具(Puppeteer、Playwright 等)允许在后台运行浏览器,但不要忘记伪装,因为自动化痕迹必须始终隐藏。

忽略 JS 验证是不行的:如果存在,您必须通过它,否则您将无法获取数据。确保您的抓取器加载相关脚本、执行它们并存储用于后续请求的 cookie 或令牌。

行为分析:速度、顺序、交互

即使机器人绕过直接障碍,例如 CAPTCHA 和其他可见的反机器人方法,非人类行为模式仍可能是致命的。典型用户在产品页面上停留几秒钟,滚动,点击图片,然后继续导航。一个脚本可以立即加载页面并以完全可重复的顺序进行。现代网站跟踪此类异常。极高的导航速度、请求之间可疑的规则间隔和类似模式明显表明自动化。

另一个标志是异常导航顺序——例如,按字母顺序抓取 URL 或严格遵循站点地图,而这是普通访客很少做的。一个简单的指标是缺乏人性化的互动信号。如果日志显示一个会话查看了100个页面没有任何滚动或鼠标移动,则很可能是机器人流量。

也存在基于时间的陷阱。表单可能强制规定最短完成时间。大多数人花费至少5-10秒钟来输入凭证,而机器人可以在毫秒内提交。如果表单几乎瞬间提交,则自动化的可能性很高,网站可能会拒绝请求。类似的方法适用于导航:过快移动到下一步——尤其是支付这样复杂的步骤——在反机器人系统中引起怀疑。

如何避免:主要原则是模仿真实用户行为。在抓取器工作流程中引入随机性和自然模式。

首先,不要追求最大的抓取速度。如果速度不重要,以稍慢但更小心的方式工作更安全。在请求之间插入暂停——不是固定的,而是在一定范围内随机化。在每个页面上添加延迟以模拟阅读时间。

其次,避免严格的导航顺序。如果可能的话,在抓取顺序中引入随机性(例如,更改部分顺序或在页面上随机选择链接而不是按顺序迭代)。

第三,在无界面场景中添加自然交互的迹象。高级管道可能包括滚动、光标移动、打开界面元素和步骤之间的小暂停。这些动作不会直接影响数据收集,但会使工作流程更像人类,特别是在长页面和多步骤流程中(登录→选择→结算),一致的时间安排看起来不自然。

还要考虑网站的观点:许多系统将行为分析与遥测和网络分析结合。页面上的跟踪器可以记录交互事件和会话时间。如果日志显示没有典型信号的空会话,仅此一点就显得可疑。因此,重要的是不仅要评估抓取器的动作,还要评估会话数据实际生成的内容及其在监控方面的解释方式。

请求速率和体积限制

另一个用来区分机器与人的明显标准是请求频率。即使是最快的用户也无法每秒发送数十个请求,但脚本可以。这就是为什么实施服务器端限制:例如,每分钟来自单个 IP 的请求不超过 N 个。如果超过限制,则会触发临时或永久性封锁。在 Web 服务器或 CDN 级别,通过跟踪请求数量并过滤掉超过阈值的突发来实现。这取决于网站的政策:在某些地方每秒 5 个请求可能可以接受,而在其他地方,即使每秒 1 个请求也会被视为过多。这很容易实现:使用 Nginx,您可以配置每个 IP 每秒 1 个请求的限制,拒绝超过此限制的请求。

除了频率,还监控并发性。普通用户不太可能在不同标签中同时打开网站的 20 个页面,而抓取器可以轻松生成许多并行线程。这也会被跟踪:一个地址的太多同时会话足以怀疑是机器人网络或抓取器。

如何避免:首先,限制您脚本中的并发水平。是的,将目录抓取并行化为 50 个线程,并在一分钟内收集数据非常诱人,但在 99% 的情况下,这会立即引起不必要的关注。如果您看到网站对负载敏感,最好使用几个线程(甚至一个)工作。

其次,注意您的 IP 地址轮换。大多数网站记录每位访问者的 IP,并在检测到可疑活动时阻止整个地址。这就是为什么使用代理是认真抓取的标准做法。使用 IP 轮换是有意义的:在发送一定数量的请求或切换章节后,改变出口点地址。理想情况下,请始终使用住宅移动代理。配置抓取器时重要的是同一 IP 不要发出太多连续请求。例如,从一个地址发送不超过 5-10 个请求,然后切换。如果您的代理池有限,至少尝试交替使用它们并保持暂停。

此外,始终监测您的请求的响应头和状态代码。如果您开始接收到 HTTP 429 的“请求过多”或在页面内容中看到诸如“请求次数过多,请稍后再试”等内容,这是一个明确信号,表明请求限制已被触发。这种情况需要降低抓取速度、增加代理数量或使用其他技术。作为一种选择,如果限制是针对 IP 地址设置的,并且网站通过 HTTP 访问并允许在没有额外检查的情况下更改用户代理和引用者,轮换它们可能会有所帮助。

Error 1015

一般来说,主要规则是不突出:您越是无缝融入正常用户的背景流量中,您的抓取器就能在不被封锁的情况下运作更长时间。

头文件和浏览器指纹

网站可以通过分析请求参数的技术细节在连接阶段检测抓取器。每个 HTTP 请求都包含一组头文件(User-Agent、Accept、Accept-Language、Cookie 等),这些共同构成了浏览器配置文件。对于常规浏览器,这些配置文件是相当可预测的:例如,当使用 Chrome 访问网站时,您发送的头文件集具有特征,比如User-Agent: Mozilla/5.0 … Chrome/version …,加上支持语言列表(Accept-Language),获取标志(Sec-Fetch-* headers),等等。而机器人可能会发送不寻常或不完整的头文件集。许多网站立即屏蔽带有可疑用户代理字符串的请求,例如ScrapycurlWgetPython等,在防火墙级别。而即使您发送这样的字符串不被屏蔽,这个事实本身也会被视为总体风险得分的一部分。

即使替换为常见浏览器字符串,细节上也可能失败。例如,Headless Chrome 以前会暴露自己因为用户代理字符串包含“HeadlessChrome”一词。另一个例子:机器人不发送Accept-Language头文件(真正的浏览器总是发送语言偏好)。

另一个指标:头文件的顺序或其值与声明的浏览器不匹配。反机器人系统维护着大量浏览器指纹数据库 - 不同版本的 Chrome、Safari 和 Firefox 的不同头文件和值的模板。如果您假装是 Chrome 120+ 并发送相应的用户代理,但没有包含典型的现代 Chromium UA 客户端昵称头文件(Sec-CH-UASec-CH-UA-MobileSec-CH-UA-Platform),或者格式不正确,或由用户点击触发的导航请求不包含Sec-Fetch-User: ?1而其他Sec-Fetch-*头文件都在,可能会通过此类小的不一致之处暴露自动化(这只是一个说明性例子)。

此外,除了 HTTP 头文件,浏览器还可以通过navigator对象和 JS 环境暴露自己。无头模式通常包含一个navigator.webdriver属性,这对于自动化浏览器通常是true。然后网站可以运行一个小的客户端脚本:if (navigator.webdriver) { /* Bot detected */ } ——这个简单的方法足以抓住初学者。其他检查 Selenium 或 Playwright 留下的对象。例如,Playwright 在window中插入某些服务变量(__playwright__binding__等),页面上的脚本可以查找这些外部控制的迹象。

更高级的检查包包括Canvas API或WebGL测试,其中渲染一个隐藏图像并收集画布指纹,这可能匹配一个典型的模拟器签名。

简而言之,网站有许多可用的检查,环境伪装甚至可以通过 JS 实现中的小差异被检测到。

如何避免:尽可能地伪装成真实的设备/浏览器。始终设定与流行浏览器相对应的现实用户代理,并保持更新。但一个头文件不够:也要调整其他头文件。添加Accept-Language(考虑到 IP 区域)、Accept与常见浏览器的内容类型、ConnectionUpgrade-Insecure-RequestsSec-Fetch-*头文件等。最简单的方法是检查您的浏览器访问目标网站时发送的头文件(通过开发者工具或代理)并进行仿真。关注一致性:如果您声称自己是 Windows 上的 Chrome,您应该拥有面向 Windows 的用户代理,并在需要时添加一个Sec-CH-UA-Platform: "Windows"头文件。

如果您使用无头浏览器,请使用库或设置以自动启用自动化掩饰(例如,Puppeteer 有 puppeteer-extra-plugin-stealth 包,可禁用 navigator.webdriver 和其他暴露标志,或来自 rebrowser 的补丁版 playwright/puppeteer 隐藏这些库的许多标准弱点)。如果您创建低级抓取器,请通过DevTools Protocol手动修改navigator以设置与真实浏览器匹配的属性。

当然,无需模拟到绝对所有的随机 Canvas 噪音。最好的做法是从基础开始——头文件和简单的 JS。切勿发送明显可疑的字符串,定期更新头文件模板以匹配当前浏览器,启用小交互的仿真,并在可能的情况下,使用反检测工具测试您的机器人。工具如 BrowserScan 或 FingerprintJS 可以显示您的脚本暴露了哪些信号。

其他技巧:从“无限迷宫”到第三方服务

除了上述之外,还有更多值得了解的异国诱捕陷阱。一些资源故意创建“无限”的链接结构——对于抓取器来说是一种迷宫。

一个经典例子是动态生成的无尽日历页面或参数化的 URL,导致循环。没有适当停止条件的机器人可能会试图遍历无限的链接流而被困住。结果是浪费资源,并通过不寻常的行为向反机器人系统暴露自己。对于真实用户,这类链接通常无法到达,但机器人可能会掉入这样的陷阱。

如何避免:首先,始终分析收集的数据的合理性。如果您的抓取器突然跟随了一串链接进入不应该去的地方,并下载了看似随机短语的大量文本,您可能已经进入了迷宫。实现循环检测逻辑是有用的:跟踪访问过的 URL,限制抓取深度,验证新链接是否属于您需要的同一域或部分。

其次,始终考虑上下文:如果您抓取的例如是评论网站,而机器人突然开始下载明确不相关或不连贯的 AI 生成文本的页面,这是理由要小心并停止该会话。

也要记住第三方服务也帮助网站识别机器人。Cloudflare Bot Management、Datadome、PerimeterX 等产品专门检测自动流量。它们使用从行为分析和指纹识别到已知机器人的数据库甚至机器学习的一系列方法来识别不寻常的访问者。

如果您的机器人遇到强大的反机器人系统,任务会变得更复杂,因为检测可能基于小信号的组合。在这种情况下,上述讨论的所有内容都适用,您还需要考虑待抓取方的不断规则完善。有时限制请求量到不触发保护系统的水平或者更换抓取策略会更便宜。使用代理时,您可以尝试伪装成不同的真实用户,并且不仅更改 IP 地址,还要更改地理位置、用户代理和请求时间(模拟在一天中的不同时间访问,而非连续非停止活动)。

总结

如您所见,没有一个魔法按钮可以永久消除阻塞风险。成功的抓取需要技术方法和细致执行的组合:

  • 检测和忽略诱捕元素:在点击链接或填写字段之前,确保该元素没有从人类视野中隐藏。不要跟随可疑的 URL,也不要填写不可见的表单字段。

  • 模仿真实用户:使用典型普通浏览器的真实头文件和值(用户代理、Accept-Language 等)。尽可能将抓取通过反检测浏览器的浏览器内核运行,以通过 JS 检查并确保真实环境(navigator、cookies、localStorage 等)。

  • 限制速度和并发性:配置请求之间的延迟和暂停,使用随机化的间隔。不要超出请求限制,逐渐扩展,并监测网站反应(HTTP 429 代码、CAPTCHA 等)。

  • 轮换 IP 地址和会话标识符:使用代理或 VPN 池,交替 IP,特别是在大规模抓取时。确保单个 IP 使用频率不过高。始终首选住宅 IP,因为它们对反机器人系统来说不那么可疑。

  • 在抓取行为中引入随机性:模拟用户动作,例如,轻微的滚动、鼠标移动、阅读页面的时间。避免完全顺序的路线,并变换行动模式以不显示刚性算法。

网络抓取中的对抗仍在继续,随着网站发明新的检测方法,机器人开发者寻找规避的方法。在这场游戏中,赢家是更加细心和富有创造力的一方。让您的机器人正是这样:小心、灵活且人类地不可预测。

随时获取最新的Octo Browser新闻

通过点击按钮,您同意我们的 隐私政策

随时获取最新的Octo Browser新闻

通过点击按钮,您同意我们的 隐私政策

随时获取最新的Octo Browser新闻

通过点击按钮,您同意我们的 隐私政策

立即加入Octo Browser

或者随时联系客户服务,如果您有任何问题。

立即加入Octo Browser

或者随时联系客户服务,如果您有任何问题。

立即加入Octo Browser

或者随时联系客户服务,如果您有任何问题。

©

2026年

Octo Browser

©

2026年

Octo Browser

©

2026年

Octo Browser