为什么先要分真假
蜘蛛池的入口页每天会产生大量访问日志,其中一部分来自搜索引擎爬虫,另一部分来自各种采集器、扫描器和普通用户。如果只按 User-Agent 里有没有 Googlebot 之类的字样来统计,很容易把抓取量算高,进而误判入口页是否真的在被搜索引擎发现。把真假蜘蛛分开,目的是让统计口径更接近事实,而不是去对抗某一类流量。
UA 只是对方的一句话
User-Agent 由请求方自己填写,任何脚本都能写成一模一样的字符串。所以 UA 可以作为筛选条件,但不能作为结论。日志里看到 Googlebot,只能说明“有请求自称是 Googlebot”。
三种可以叠加使用的验证手段
1. 反向 DNS 双向校验
主流搜索引擎的爬虫通常有可反解的主机名,例如以 googlebot.com、search.msn.com 这类域名结尾。做法是拿访问来源 IP 做一次反解,得到主机名后,再对主机名做一次正向解析,看结果是否回到同一个 IP。两次都能对上,可信度才比较高。只做反解而不回头验证,容易被伪造的 PTR 记录骗过。
2. 官方 IP 段比对
各大搜索引擎会公布爬虫使用的 IP 段,可以定期拉取并入库,用来源 IP 直接比对。这种方式在 CDN 回源、代理转发的场景要特别注意:日志里记录的可能是代理 IP 而不是真实来源,需要在服务端配置里保留真实 IP 字段,否则比对结果没有意义。
3. 行为特征
- 抓取路径:真爬虫通常会沿着站点已有的链接走,路径分布有一定规律;扫描器更倾向于遍历常见后台路径和敏感文件名。
- 请求频率与并发:真爬虫一般有相对稳定的节奏,不会在几秒内把同一个入口页打成上百次。
- 请求头完整性:Accept、Accept-Encoding 等字段的组合方式也有参考价值,但它只是辅助证据。
- 对 robots.txt 的响应:可以观察对方是否先取 robots.txt、是否遵守其中的限制,同样不能单独下结论。
日志里应该保留哪些字段
如果日志只留了 UA 和路径,后面很难做验证。建议至少保留:时间、来源 IP、请求方法、完整 URL、状态码、响应时间、UA、Referer,以及服务端透传的真实 IP。字段齐全之后,真假判断可以在离线分析里做,不必在入口服务器上实时处理,对性能影响也更小。
把识别做在分析层而不是拦截层,误伤真爬虫的概率会低很多。
认出来之后怎么处理
对确认的搜索引擎爬虫,可以单独统计它抓取入口页的数量、状态码分布和平均响应时间,用来判断入口页是否真的在被发现。对确认的假爬虫,先看它消耗了多少带宽和连接数,再决定是限速、加缓存还是拒绝。直接按 UA 封禁风险较大:规则写得太宽,可能把真爬虫和正常用户一起挡掉;写得太细,维护成本又会持续上升。
一个简单的落地顺序
- 先保证日志字段完整,尤其是真实来源 IP。
- 再建立官方 IP 段与反解校验的比对脚本,按天跑一次。
- 把结果分成“确认真爬虫”“疑似”“确认非爬虫”三档,分别统计。
- 最后才考虑对第三档做流量层面的处置。
真假蜘蛛的识别不会一次到位,IP 段和反解规则都会变。把它当成一项定期维护的基础工作,比追求一套永远有效的名单更实际。