在斗篷系统的投放实践中,识别搜索引擎爬虫与广告审核机器人,是决定落地页展示内容的核心前置环节。绝大多数投放者都会配置基础的UA黑名单,但当审核方开始使用真实浏览器UA模拟访问时,仅靠UA判断便会失效。本文不讨论UA列表的堆砌,而是从检测逻辑的层次出发,说明如何将UA特征与行为特征(访问深度、停留时间、鼠标轨迹、请求顺序)结合,构建更稳健的爬虫识别策略,并给出Nginx与PHP环境下的通用配置示例。
爬虫识别的三层检测架构
一套可用的爬虫识别策略,通常不是单一规则,而是三层递进结构:
- 静态特征层:包括User-Agent、Accept-Language、Sec-Fetch-*头、IP段(如Googlebot的IP段)、ASN归属。这一层成本最低,但最容易被伪造。
- 行为特征层:包括访问路径深度、页面停留时间、滚动行为、鼠标移动、请求间隔、是否加载图片/CSS/JS等资源。真实用户与爬虫在此层差异明显。
- 动态验证层:包括JS挑战、Canvas指纹、WebRTC IP检测、Cookie一致性校验。这一层最准确,但可能影响用户体验和加载速度。
斗篷系统的规则引擎通常允许你对上述层级自由组合,但多数投放者只使用了第一层,导致误判率偏高。正确做法是:以静态特征作为初筛,行为特征作为二次判定,动态验证仅对疑似流量启用。
UA特征识别:不要只匹配关键词
UA识别最常见的错误是直接匹配"Googlebot"或"Bingbot"字符串。事实上,Google官方支持通过DNS反向解析验证爬虫IP,但多数斗篷系统并不内置该功能。一个更实用的做法是维护两个列表:已知爬虫UA白名单(用于直接放行)和可疑UA特征库(用于标记待二次验证)。
可疑UA特征库应包含以下类型:
- 空UA或长度极短的UA(少于20字符)
- UA中包含无意义的随机字符串(如"Mozilla/5.0 (compatible;)")
- 包含多个浏览器标识的UA(如同时出现Chrome和Safari)
- 版本号过旧或过新(如Chrome/1.0或Chrome/999.0)
- 与已知真实浏览器UA完全一致但缺少正常用户代理特征(如缺少Sec-Fetch头)
一个有效的补充是检查Sec-Fetch-*请求头。真实浏览器发起页面导航时,Sec-Fetch-Mode通常为navigate,而爬虫或脚本请求则常为cors或no-cors。在Nginx中可通过$http_sec_fetch_mode变量判断:
BLOCK0
注意,并非所有爬虫都会携带此头,因此该规则只能作为加分项,不能作为独立判定依据。
行为识别:访问深度与时间间隔
行为特征的核心是模拟真实用户的浏览模式。爬虫通常不会等待页面资源加载完成,也不会产生鼠标移动事件。在斗篷系统的落地页中,你可以通过前端脚本采集以下行为信号,并回传至后端判定:
- 页面停留时长:真实用户平均停留通常在3秒以上,爬虫可能在1秒内就发起第二个请求。
- 滚动深度:真实用户会滚动查看内容,爬虫通常停留在页面顶部。
- 鼠标移动轨迹:真实用户鼠标轨迹是非线性、有停顿的;爬虫脚本通常没有鼠标事件,或轨迹过于平滑。
- 请求间隔:真实用户点击链接或按钮的间隔通常在数百毫秒到数秒,爬虫可能以固定频率(如每秒10次)抓取。
实现上,你可以在页面底部加入一段统计脚本,记录这些信号,并在用户触发关键事件(如点击按钮)时通过AJAX发送到后端。后端PHP示例:
BLOCK1
此方法的优势在于,即使爬虫模拟了真实UA,也无法模拟出自然的鼠标轨迹和停留时长。但需注意,移动端用户的行为模式与桌面端差异明显,触屏设备没有鼠标移动,此时应降低该信号的权重,否则会误伤移动端真实用户。
常见误判场景与调优
以下三种情况最容易导致误判,需要针对性调整规则:
场景一:广告审核员使用真实浏览器手动访问。此时UA和行为特征都是真实的,仅靠行为识别无法拦截。常见的应对方式是加入IP信誉库——审核机构的IP段通常位于特定数据中心,或具有较低的恶意评分。你可以通过第三方IP库(如MaxMind)查询ASN,并将常见审核机构的ASN加入黑名单。但需注意,数据中心IP也可能被真实用户使用(如企业VPN),因此应结合行为评分综合判断。
场景二:爬虫模拟了完整的行为信号。一些高级爬虫会模拟鼠标轨迹和停留时间,此时需要引入动态验证层,如JS挑战或Canvas指纹。但这类验证会增加落地页加载时间,且可能被部分真实用户的环境拦截(如禁用JS)。建议仅对行为评分处于临界区间的流量启用动态验证,对评分极低的流量直接返回安全页。
场景三:移动端误伤。iOS的Safari在无痕模式下会禁用部分存储API,导致行为脚本无法正常回传,从而被误判为爬虫。此时应增加降级逻辑:若脚本无法执行,则默认放行,但对该IP加上短期Cookie标记,后续访问再加强验证。这里可参考斗篷系统Cookie池隔离策略中的隔离思路,将不同渠道的流量分开处理,避免误伤扩散。
配置落地:Nginx与PHP的通用方案
以下是一个可在大多数Nginx+PHP环境中直接套用的配置逻辑:
- 在Nginx层做UA初筛,将明显可疑的UA直接标记为
$cloak_flag = "bot",不进入PHP处理,节约资源。 - 对非bot流量,在PHP中读取前端回传的行为数据,计算行为评分。若评分低于阈值,则返回安全页;若高于阈值,则正常展示落地页。
- 对处于中间区域的流量(如评分40-70),则触发一次JS挑战,验证通过后设置短期Cookie,后续访问直接放行。
配置示例(Nginx片段):
BLOCK2
在PHP端,你只需读取$_COOKIE['cloak_pass'],若存在则直接输出落地页,否则引入行为采集脚本。这里建议将行为采集脚本的加载放在页面底部,且不阻塞渲染,以减少对真实用户的影响。
此方案与斗篷系统部署:Nginx+PHP环境实测避坑指南中的部署要点可以结合,例如在配置缓存时,将不同$cloak_flag对应的页面分别缓存,避免缓存串扰。
小结
爬虫识别永远是一场猫鼠游戏,不存在一劳永逸的规则。但通过分层检测、行为评分、动态验证的组合,可以在保证真实用户转化体验的前提下,显著降低审核机器人误判率。建议定期更新UA特征库,并针对广告渠道的审核行为模式持续调优行为评分权重。同时,注意与斗篷系统规则优先级冲突:解析与调优实战中提到的规则优先级问题相配合,确保爬虫识别规则不会被其他规则意外覆盖。最终,你的目标不是识别所有爬虫,而是识别那些会导致广告账号风险的爬虫,并为他们提供正确的安全页内容。