同一条 URL,用浏览器打开一切正常,翻服务器日志却发现搜索蜘蛛拿到的是 500、403,或者一个“正在验证您的浏览器”的中间页。这种情况并不罕见,问题通常不在蜘蛛本身,而在于同一条地址对不同的请求走了不同的处理链路:UA、IP、请求频率、证书、回源节点,任何一个环节都可能把爬虫单独筛出去。
先分清是“被拦住”还是“真报错”
这两类问题的处理方式完全不同,第一步要先把性质定下来。
- 被拦截:请求在到达应用之前就被 WAF、CDN 或安全插件处理掉了,常见表现是固定返回 403、429、503,或返回一个体积很小、内容高度模板化的验证页。
- 真报错:请求确实到了应用层,但因为参数、缓存、数据库或超时抛出了 500。典型特征是同一路径换个参数就正常,或者错误集中在某个时间段。
判断方法很简单:用日志里那条记录的时间点和路径,手工带相同的 UA 复现一次。如果复现出同样的结果,说明可稳定重放;如果浏览器访问始终正常、只有蜘蛛异常,多半指向拦截规则。
日志里值得重点看的几个字段
按 UA 分组统计状态码
把日志按 User-Agent 聚合,分别统计 2xx、3xx、4xx、5xx 的占比。如果普通浏览器 UA 的 5xx 占比接近零,而爬虫 UA 的 5xx 占比很高,基本可以锁定是针对性处理。
响应体大小
验证页、拦截页往往只有几百字节到几 KB,而真实页面通常明显更大。把同一路径下“响应大小”这一列排一下序,异常小的那一批就是可疑对象。
响应时间与并发
如果错误集中在蜘蛛集中抓取的几分钟内,随后自动恢复,更像是限速或连接数打满,而不是永久性屏蔽。
IP 段与访问路径
爬虫的请求 IP 相对集中。把异常状态码对应的 IP 单独拉出来,看它们是否同时还在请求大量不存在的路径。若同时存在这种情况,先排除是不是被误伤的正常爬虫,还是有人在用类似 UA 做扫描。
常见原因与对应处理
- UA 规则拦截:部分安全策略会因为 UA 里带爬虫标识就直接拒绝。处理方式是核对规则意图,确认无误后再考虑放行。
- 频率限制:短时间内请求量超过阈值触发保护。可以先观察抓取日志的分布,判断是正常抓取还是异常压力,再调整阈值。
- 动态渲染差异:站点对非浏览器请求返回空壳页或 JS 挑战页。此时蜘蛛看到的内容和用户看到的不一致,需要检查渲染策略是否对爬虫生效。
- CDN 回源节点异常:同一 URL 在不同节点上结果不同。可以固定回源验证,或对比不同节点的响应。
- 应用层错误:缓存穿透、超时、证书链不完整都可能导致 5xx。这类要修应用,加白名单没有用。
放行时要注意什么
- 不要只看 UA。UA 是可以随意伪造的,仅凭它放行等于对所有人开放。
- 优先按搜索引擎官方公布的 IP 段或反向 DNS 校验来配置白名单,并定期更新。
- 放行对象尽量限定到具体路径和必要的方法,避免整站无差别放开。
- 修改后保留一段观察期,把改动前后的状态码分布做对比,确认问题确实消失。
把拦截问题修好,只是让蜘蛛能正常读到页面,并不等于页面一定会被收录。抓取顺畅和收录结果是两件事,后者还取决于内容质量、重复度和站点整体情况。
一个容易忽略的细节
有些站点在修复后,日志里确实不再出现 500,但蜘蛛的来访频率反而下降了一段时间。这通常是抓取节奏在重新评估,并不代表被降权。此时不建议立刻做大幅改动,先让日志稳定运行几天再看趋势,比反复调整规则更容易看出真实变化。