做蜘蛛池和站点运营的人,几乎每天都会看访问日志。日志里出现 Baiduspider、Googlebot、bingbot 之类的 UA 时,很多人的第一反应是“搜索蜘蛛来了”。但 UA 只是一个 HTTP 请求头字段,任何人写几行代码就能伪造。仅凭 UA 判断,很容易把普通爬虫、采集程序甚至扫描工具当成搜索蜘蛛,从而对抓取情况做出错误判断。
为什么 UA 不能单独作为判断依据
User-Agent 由客户端自行填写,服务端无法强制约束。常见的误判有几种:
- 采集工具直接照抄搜索引擎 UA,日志里看起来和真蜘蛛一模一样;
- 安全扫描器为了降低被拦截概率,也会伪装成搜索引擎;
- 某些 CDN、监控、预渲染服务同样会带上类似 UA。
反过来也成立:真蜘蛛有时会使用移动版 UA 或带版本号后缀的 UA,如果只匹配固定字符串,反而会漏判。
第一步:反向 DNS 回查
主流搜索引擎都支持用反向 DNS 验证来源。做法是先拿访问日志里的 IP 做一次反向解析,看域名是否属于对应搜索引擎的官方域;再把解析出来的域名做一次正向解析,确认能回到同一个 IP。
- Baiduspider:反向解析结果一般落在 baidu.com 相关域下;
- Googlebot:一般落在 googlebot.com 或 google.com 下;
- Bingbot:一般落在 search.msn.com 相关域下。
两步都通过,才基本可以确认。只做反向解析、不做正向回查,仍然可能被伪造的 PTR 记录骗过。可以用 host、dig -x、nslookup 等命令手工验证,规模大时再考虑脚本批量处理。
第二步:看 IP 段归属
搜索引擎官方通常会公布自己的爬虫 IP 段,以 JSON 或文本形式提供。把日志 IP 和官方段做比对,比逐个反查更快。需要注意的是,IP 段会更新,最好定期重新拉取,不要用一份几年前的副本长期比对。
如果服务器前面有 CDN 或反向代理,日志里记录的可能是 CDN 节点 IP,而不是真实来源 IP。这时要先确认是否读取了 X-Forwarded-For 之类的头部,否则校验的对象就错了。
第三步:看行为特征
IP 和 DNS 都难以确认时,行为特征可以作为辅助参考:
- 真蜘蛛通常有相对稳定的抓取节奏,请求间隔比较规律,不会在短时间内把全站打一遍;
- 会读取 robots.txt 并遵守其中的 Disallow 规则;
- 请求头比较完整,一般会带 Accept、Accept-Encoding 等字段;
- 不会主动提交表单、登录、点击广告,也不会扫描常见后台路径。
行为特征只能作为参考,不能单独下结论,尤其是流量小的站点,样本太少时判断容易失真。
发现伪装爬虫之后怎么处理
先分清影响:如果只是普通抓取,占用带宽有限,可以直接忽略;如果频率高到影响服务器,再考虑处理。
- 在 WAF 或 Nginx 层按 IP、频率、UA 组合做限速;
- 对确认伪造搜索引擎 UA 的 IP 单独封禁,别误伤真蜘蛛 IP 段;
- 保留一段时间的日志,方便回溯封禁是否误伤;
- 不要因为出现伪造 UA 就整体屏蔽搜索引擎 UA,那样会连带把真蜘蛛挡在外面。
对蜘蛛池运营的实际意义
蜘蛛池的效果判断,很大程度上依赖日志。如果把伪装爬虫当成搜索蜘蛛,很容易得出“入口页被抓了很多次”的结论,但目标 URL 迟迟不收录;反过来,如果把真蜘蛛误判为伪装,又可能封掉真正带来抓取的机会。所以校验这一步值得做扎实,而不是只看 UA 字符串。
日志是判断抓取情况的基础,但日志里的 UA 只是线索之一。IP、DNS、行为三者交叉验证,结论才更可靠。