先说结论:入口頁本身被 CDN 或 WAF 拦下来,搜尋蜘蛛看到的就不是你的 HTML,而是拦截頁、驗證頁,或者干脆是 403、429 响應。連結都讀不到,自然谈不上顺着發現目标 URL。這類問题的隐蔽之處在于,你在浏览器里打開入口頁一切正常,服務器日誌里也可能只有零星几條记錄,很容易被誤判成“蜘蛛根本不来”。
拦截發生时,搜尋蜘蛛實际拿到的是什么
常见的几種结果:
- 返回 403、406、429 等狀態碼,正文是一段很短的拒绝提示;
- 返回 200,但正文是“請稍後重试”“正在驗證您的浏览器”之類的中間頁;
- 返回一段 JavaScript 挑战脚本,需要浏览器执行後才跳轉,蜘蛛通常不會执行;
- 时好时坏,同一個入口頁有时正常返回、有时被拦,表現為抓取量忽高忽低。
其中最容易被忽略的是第二種。狀態碼正常,但内容並不是你寫的入口頁,排查时如果只看狀態碼就會漏掉。
對 URL 發現的影响
搜尋蜘蛛的抓取流程大致是:請求頁面 → 拿到 HTML → 解析出連結 → 加入待抓取队列。第一步失敗,後面全部断掉。具体差別在于:
- 明确的拒绝狀態碼:這次抓取算失敗,蜘蛛可能短期内降低對入口頁的抓取频率,等一段時間再试;
- 200 的驗證頁:更麻烦,蜘蛛會把驗證頁当成入口頁的真實内容,頁面里没有目标連結,于是不會有任何後續抓取,而且它並不認為這次是失敗;
- 間歇性拦截:蜘蛛能發現一部分連結,但發現速度不稳定,你很难從資料上判断到底是入口頁质量的問题,還是拦截導致的。
怎么判断是不是被拦了
- 用命令行按搜尋蜘蛛的 UA 直接請求入口頁,看返回碼和正文,不要只用浏览器看;
- 換几個 UA 和不同来源 IP 各請求一次,確認拦截是不是只针對特定 UA 或網段;
- 登入 CDN / WAF 後台看拦截日誌,一般能看到命中規則、触發時間和来源 IP,比對一下是不是搜尋蜘蛛的 IP 段;
- 查服務器訪問日誌里搜尋蜘蛛請求的响應碼和响應体大小,响應体明顯偏小的,多半返回的不是真實頁面;
- 把同一入口頁放在一個没有 WAF 的环境里對比,看抓取记錄是否明顯變多。
處理思路
方向無非两條:要么让搜尋蜘蛛的請求不被拦,要么別把入口頁放在容易触發拦截的环境里。
- 在白名單里放行已知的搜尋蜘蛛 UA 和官方公布的 IP 段,注意不要只按 UA 放行,UA 可以伪造,最好 UA 加 IP 段一起判断;
- 關掉针對搜尋蜘蛛的 JavaScript 挑战和频率限制,把“人机驗證”類規則從入口頁路径上排除;
- 如果規則一时改不了,把入口頁迁到規則宽松的獨立子域或獨立服務器上,只把真正需要防護的业務放在 WAF 後面;
- 改完規則後重新用命令行驗證一遍,確認返回的是完整 HTML,而不是驗證頁。
提示:拦截問题最好先看 WAF 日誌再動手改配置,否則容易把正常防護一起關掉。另外,入口頁恢复可訪問並不代表之前被拦的那批 URL 會立刻被抓,蜘蛛需要重新回訪,给一点時間观察抓取记錄的變化。
最後提醒一句,入口頁只是被發現的一個环节,解决拦截能保證“蜘蛛能讀到連結”,但不等于目标 URL 一定被收錄。抓取、索引、排名是三個獨立的阶段,把拦截修好只是把第一道门打開。