在蜘蛛池的日志里,看到一串带 Googlebot、Baiduspider、bingbot 的 UA,很容易让人以为蜘蛛来得很勤。但如果把这些访问直接当成抓取效果,往往会得出偏乐观的结论。UA 只是一段可以随意改写的请求头,采集器、扫描器、压力测试脚本都能把自己写成搜索引擎蜘蛛。
为什么日志里会有“假蜘蛛”
伪造 UA 的成本几乎为零,只是一行配置的事。采集程序伪装成搜索引擎蜘蛛,是为了绕开一些针对性的限制;扫描器往往随机挑一个常见 UA;还有一些预取、监控、代理服务的请求也会带着类似的标识。另一方面,真实蜘蛛的 UA 也在变化,移动端 UA、图片代理、版本更新后的新标识,都可能被不熟悉的人当成假的。
所以问题不在于“有没有假蜘蛛”,而在于你用什么依据去区分它们。只靠 UA 列表做匹配,等于把判断权交给了一个可以随意填写的字段。
验证真蜘蛛的几个信号
rDNS 反查与正向确认
以 Googlebot 为例,先对来访 IP 做反向 DNS,得到形如 crawl-xx-xx-xx-xx.googlebot.com 的主机名,再对该主机名做正向解析,确认能回到同一个 IP。两步都对上,可信度才高。Bing、Yandex 等也有类似的验证思路。
要注意,不是所有搜索引擎都长期提供可反查的 rDNS,有些请求会从云主机 IP 段发出。所以 rDNS 通过可以加分,rDNS 不通过也不一定就是假的,需要结合官方公布的 IP 段一起看。
官方 IP 段列表
Google、Bing 等会公布蜘蛛使用的 IP 段,有 JSON、文本等格式。把日志里的 IP 与这份列表比对,比看 UA 可靠得多。百度、搜狗等可以结合搜索资源平台和官方文档获取说明。维护一份定期更新的 IP 段清单,是蜘蛛池日志分析的基本功。
行为特征只能做参考
- 真蜘蛛通常有抓取节流,不会在几秒内把入口页并发打满;
- Googlebot 渲染页面时会请求部分 JS、CSS 资源,百度蜘蛛多数情况下主要取 HTML;
- 真蜘蛛一般会请求 robots.txt,但 Google 会缓存该文件,不一定每次都读;
- 真蜘蛛的请求通常不带 referer,或者 referer 指向自身域名;
- 伪造者往往只请求目标 URL,不加载页面里的资源,也不管 robots 规则。
这些特征能帮你缩小范围,但单独拿出任何一条都不够:有的真蜘蛛也不加载资源,有的采集器同样会抓取 robots.txt。
用搜索资源平台交叉验证
Google Search Console 的抓取统计、百度搜索资源平台的抓取频次与抓取诊断,是官方给出的口径。当日志统计与官方数据差得很多时,优先相信官方数据。第三方工具给出的“蜘蛛量”如果只依据 UA 判断,通常会偏高。
几个容易踩的误判
- 只看 UA 判断真假,所有统计都建立在一个可伪造的字段上;
- 把扫描器、漏洞探测的高频请求当成蜘蛛,误以为池子“被盯上了”;
- 用入口页的蜘蛛访问量代替目标页被抓取量,忽略两者之间还有链接和跳转;
- 因为少量假蜘蛛就大规模封 IP,结果误伤真实蜘蛛的正常抓取。
实操上的建议
- 先把日志做结构化处理,把 UA、IP、rDNS 结果、请求路径放进同一张表里看;
- 对 Googlebot、bingbot 这类可验证的蜘蛛做严格校验,验证不通过的不计入蜘蛛量;
- 把“入口页被访问次数”和“目标页被抓取次数”分开统计,评估效果以后者为主;
- 封禁策略从宽到严,先观察再处理,避免一上来就按 UA 拉黑;
- 每隔一段时间更新官方 IP 段清单,搜索引擎的 IP 会有调整。
蜘蛛池的效果不是看日志里出现了多少个蜘蛛 UA,而是看目标页有没有被实际抓取、有没有进入索引。UA 只是线索,不是证据。
分辨真假蜘蛛,本质上是把判断依据从“可伪造的字段”换到“可验证的字段”。日志里的蜘蛛访问量可以参考,但决定要不要调整池子、怎么调整的,应该是经过验证的抓取数据,以及目标页在搜索引擎里的实际表现。