蜘蛛抓取异常,九成问题出在 WAF 把搜索引擎的 IP 段误当成恶意爬虫拦截了,而不是网站本身挂了。正确的排查顺序是:先用带蜘蛛 UA 的 curl 复现请求拿到状态码,再翻 WAF 拦截日志和服务器 access.log 确认拦截动作,然后按「官方 IP 反查 + UA 双重校验」放行,最后到站长平台用抓取诊断验证恢复。整套流程熟练后 30 分钟内能定位。
怎么判断抓取异常是 WAF 拦的,还是网站自己有问题?
结论:用同一条 URL 分别带蜘蛛 UA 和普通浏览器 UA 请求一次,看状态码和响应体是否不同,就能一刀切开责任方。
具体操作是在服务器上执行:
curl -I -A "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" https://你的域名/
curl -I -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0" https://你的域名/
两条都返回 200 且响应体一致,说明 WAF 没拦蜘蛛,问题在别处(robots.txt、DNS、CDN 回源)。第一条返回 403、405、406、412、503,或者返回一段带 location.href 跳转、setTimeout 挑战的 HTML,第二条正常,结论就是 WAF 拦的,且大概率触发了「人机识别」或「JS 挑战」类规则。
再看服务端日志的状态码分布,这条命令能直接给出答案:
grep "Baiduspider" access.log | awk '{print $9}' | sort | uniq -c
如果 403 占比超过 80%,基本可以锁定 WAF。
WAF 为什么专门拦蜘蛛,不拦真人访客?
结论:搜索引擎蜘蛛的行为特征——高频、固定 UA、不执行 JS、不带 Cookie——恰好和 CC 攻击、恶意采集器的特征重合,WAF 的默认规则会优先怀疑它。
WAF 做拦截判断主要看四个维度:单 IP 单位时间请求数(常见阈值 60 秒内 100~300 次)、UA 是否在黑名单、是否携带有效 Cookie、能否执行 JS 挑战。真人浏览器四项全过,蜘蛛只有第一项命中、后三项全挂,所以被拦的永远是蜘蛛。
最隐蔽的坑是「JS 挑战」模式:WAF 返回 200 状态码,但内容是一段验证脚本,浏览器执行后 1~3 秒内跳回真实页面,而百度、Google 的抓取程序压根不跑 JS,它拿到的就是那段脚本本身,页面对搜索引擎等于空白。这种情况日志里看不到 403,只能靠对比响应体长度发现——蜘蛛拿到的 HTML 通常小于 5KB。
怎么正确放行搜索引擎蜘蛛?
结论:只配 UA 白名单是不安全的,必须叠加 IP 反查校验,因为 UA 可以随意伪造。
以 Nginx + ModSecurity 或云 WAF 为例,规则条件写成「UA 匹配蜘蛛关键字」AND「源 IP 反查域名后缀命中官方域名」,两个条件同时满足才放行:
- 百度:UA 含
Baiduspider,反查后缀 .baidu.com(形如 baiduspider-xxx.crawl.baidu.com)
- Google:UA 含
Googlebot,反查后缀 .googlebot.com 或 .google.com
- Bing:UA 含
bingbot,反查后缀 .search.msn.com
- 搜狗:UA 含
Sogou web spider,反查后缀 .sogou.com
- 360:UA 含
360Spider,反查后缀 .haosou.com 或 .360.cn
单条 IP 验证用 dig -x 蜘蛛IP +short 即可。更省事的做法是直接把各引擎官方公布的 IP 段导成 WAF 白名单,百度、Google 都在站长平台提供 IP 段文件,按月更新一次。
配置完记得同步检查三件事:robots.txt 没有误 Disallow、CDN 层是否还有一道独立防护、静态资源(JS/CSS)是否也被规则命中——静态资源被拦会导致渲染抓取失败,同样算抓取异常。
放行了还是抓不到,接下来查什么?
结论:按「响应时间 → 抓取频次 → 站点地图」三条线依次排除,绝大多数残留问题出在 TTFB 过慢上。
第一,测 TTFB。蜘蛛对响应时间敏感,首字节超过 3 秒会明显降低抓取频次,超过 10 秒直接放弃。用 curl -w "%{time_starttransfer}\n" -o /dev/null -s https://你的域名/ 测,目标控制在 1 秒以内。
第二,看抓取频次曲线。百度搜索资源平台的「抓取频次」和「抓取异常」两个报表,能直接看到拦截发生的时间点和异常类型(连接超时 / 返回 403 / DNS 错误),和 WAF 改配置的时间点对齐即可验证。
第三,重新提交 sitemap 并手动触发一次抓取诊断。百度抓取诊断支持指定 IP 与 UA,Google 在 Search Console 的「设置 → 抓取统计信息 → 按响应类型」里能看到分状态码的抓取量。
修好之后多久恢复?
结论:放行生效后通常 24~72 小时内蜘蛛抓取频次逐步回升,完全恢复到拦截前水平需要 7 天左右。
恢复速度取决于站点权重和历史抓取频次:日均抓取 10 万次以上的站点,24 小时内就能看到明显反弹;新站或低频站可能要走完一个完整抓取周期,即 3~7 天。别在放行后立刻反复改规则,每次改动都会让引擎重新评估,反而拖慢恢复。
一句话收束:抓取异常的排查本质是「用蜘蛛的身份去请求一次」,拿到状态码和响应体,责任方立刻清晰;放行时必须 UA + IP 反查双条件,只认 UA 等于给伪造者开门;改完盯 7 天抓取频次曲线,比盯任何单点日志都管用。