为什么要先分清真蜘蛛和假蜘蛛
蜘蛛池入口页的日志里,每天都会出现大量带着蜘蛛 UA 的请求。有些是真的搜索引擎爬虫,有些是采集脚本、扫描器或者竞争对手的探测。如果不加区分就一律当成“蜘蛛来了”,很容易得出错误的结论:以为抓取量在涨,实际只是噪声;以为某个入口页被反复抓取,其实只是别人在批量扫描你的链接。
更麻烦的是反向问题——为了防扫描,不少站长直接用 UA 关键词封禁,结果把真蜘蛛也挡在了门外。识别蜘蛛真伪的意义,就是让放行和拦截都有依据,而不是凭感觉。
三种验证手段,优先级并不相同
第一层:User-Agent 只能做初筛
UA 是最容易看到、也最容易伪造的字段,任何脚本都能把 UA 改成 Googlebot 或 Bingbot。所以 UA 只适合做第一层过滤:先把明显不是蜘蛛的请求排除掉,剩下带蜘蛛 UA 的,再进入下一层验证。
实操上建议把 UA 匹配写成白名单而不是黑名单,同时记录完整的 UA 字符串,方便后续和官方公布的 UA 列表比对。搜索引擎会不定期更新 UA,注意别把旧版本的 UA 直接判成假蜘蛛。
第二层:反向 DNS 双向验证
主流搜索引擎的官方文档里通常会说明验证方式,其中最常见的是反向 DNS:对来源 IP 做一次 PTR 查询,看解析出的域名是否属于官方网段(例如 Googlebot 对应的 googlebot.com / google.com,Bingbot 对应的 search.msn.com)。
关键在于要做双向验证:先反查 IP 得到域名,再对这个域名做一次正向解析,确认解析结果能回到同一个 IP。只做单向反查,容易被伪造的 PTR 记录骗过去。
第三层:IP 段比对
搜索引擎一般会公布爬虫使用的 IP 段列表,可以定期拉取并与日志中的来源 IP 比对。这一层最准,维护成本也最高,因为 IP 段会变动。它更适合抓取量较大、需要精细区分来源的场景。
三层验证不必全上。入口页数量不多、日志量不大时,UA 白名单加一次反向 DNS 通常就够用;只有当误封会带来明显损失时,才值得投入精力维护 IP 段。
常见的几个误区
- 只看 UA 就封 IP。共享 IP、CDN 回源、代理转发都可能让真蜘蛛的请求带上非官方 IP,直接按段封禁容易误伤。
- 把反向 DNS 失败等同于假蜘蛛。部分中小搜索引擎或新爬虫没有公开的验证方式,反查失败并不代表一定是伪造。
- 忽略 CDN 与反向代理。入口页前面如果挂了 CDN,日志里记录的可能是 CDN 节点 IP,必须从 X-Forwarded-For 等头部取原始地址,否则整套验证都建立在错误的 IP 上。
- 只拦不记。被拦掉的请求如果不留日志,后面想复盘“是不是误杀了”就没有依据。
落地建议
- 日志中至少保留:时间、来源 IP、完整 UA、请求 URL、状态码、响应时间。
- 写一个每日任务,把带蜘蛛 UA 的请求抽出来做反向 DNS 验证,结果分成“确认蜘蛛”“待定”“疑似伪造”三档。
- “待定”这一档先别急着封,观察它的行为:是否遵守 robots.txt、是否只抓入口页、请求频率是否异常。
- 确认为真蜘蛛的 IP 段,可以在限速规则里单独放行,避免统一的频率限制影响正常抓取。
- 每隔一段时间复核白名单,清理已经失效的 UA 与 IP 段。
把识别这一步做扎实之后,日志里的数字才可信,后续判断入口页该扩还是该收,才有站得住脚的依据。