网站被扫描、被撞库、被恶意抓取是常事,于是很多站点会装上 WAF、CDN 防护规则,或者按 IP、按 User-Agent 做频率限制。问题是这些规则大多奉行“先拦再说”,搜索蜘蛛一旦被归进拦截名单,URL 发现就会在入口处断掉,而且从站内看几乎没有明显异常——页面自己能打开,只是蜘蛛进不来。
误封通常是多层规则叠加的结果
很少有人会主动把蜘蛛加进黑名单,实际发生的拦截多来自几层规则的叠加:CDN 的地域限制、WAF 的通用攻击特征库、服务器上的并发限速,以及 Web 服务层面的 UA 过滤。单看每一层都“不算严”,合起来就可能把正常抓取请求挡在第一步。
- 把 UA 中含有“bot”的请求一律拒绝,误伤 Googlebot、Bingbot 等正规爬虫;
- 对同一 IP 段做并发或 QPS 限速,蜘蛛集中抓取时触发封禁;
- WAF 把带参数的 URL 判成注入攻击,列表页、筛选页最先被拦;
- 按地域屏蔽,而蜘蛛的出口 IP 恰好落在被屏蔽的地区;
- 验证类挑战页(JS 挑战、滑块)蜘蛛无法执行,请求停在挑战页上。
先确认被拦的是不是真蜘蛛
发现流量被拦之后,不要急着放开整段 IP,先把“是不是真蜘蛛”确认清楚,否则等于给伪装爬虫开门。比较可靠的做法是做反向 DNS 查询:从访问日志里取到 IP,反查主机名,再正向解析一次,看是否对得上官方公布的域名后缀。主流搜索引擎都提供官方的验证方式,IP 段也有公开列表,可以定期比对。
同时看三组数据:服务器访问日志里的状态码分布(403、429、503 集中在哪些路径)、搜索资源平台里的抓取统计(抓取请求数、平均响应时间是否突然下滑)、以及 robots.txt 抓取测试工具返回的结果。三边对得上,基本能定位拦截发生在哪一层。
放开访问时的顺序
- 先放行已验证的蜘蛛 IP,而不是放行整个网段或所有 UA;
- 把 robots.txt、Sitemap、主要栏目页加入限速白名单,这些是 URL 发现的入口;
- 为蜘蛛单独设置一条高阈值或不限速的规则,与普通用户流量分开统计;
- 观察一到两周,确认抓取请求量恢复正常,且没有明显异常流量;
- 再逐步收紧其他规则,避免一次性全开带来风险。
被拦住的代价不只是抓不到
蜘蛛访问失败时通常会重试,但如果连续拿到 403 或 429,抓取频率会被主动下调,新发布的 URL 排进队列的时间被拉长,Sitemap 里提交的地址也可能迟迟不被访问。更麻烦的是这种状态没有报错提示,站内一切照常,只有抓取日志里能看到入口页面的失败记录。
排查 URL 发现问题时,先确认蜘蛛能不能进来,再去看内链和 Sitemap。入口被封的情况下,后面所有优化都无从生效。
一份可落地的自检清单
- 确认 WAF/CDN 规则中没有针对通用爬虫 UA 的一刀切拒绝;
- 验证通过反向 DNS 确认的蜘蛛 IP 不触发限速与地域封禁;
- robots.txt 与 Sitemap 地址不落在需要登录或需要 JS 挑战的路径下;
- 定期检查抓取统计中的失败比例,尤其关注首页与栏目页;
- 规则变更后保留一段观察期,记录抓取量变化再决定下一步。
防护本身没有错,问题在于防护规则与抓取通路之间缺少一层校对。把已验证的蜘蛛从风控名单里单独拎出来,用白名单的思路管理,URL 发现的路才不会被自己堵上。