蜘蛛池做的是把 URL 摆到蜘蛛可能经過的位置,但蜘蛛最终能不能打開頁面、拿到什么狀態碼,取决于從 DNS 解析到源站返回這一整條鏈路。CDN、缓存层、WAF、负载均衡,任意一层出問题,前面做的投放都會被削弱,而且往往從蜘蛛池這一侧看不出来。
蜘蛛訪問頁面时,中間會经過哪些层
一次抓取大致會经過:DNS 解析、CDN 邊缘节点、可能存在的 WAF 或訪問防護、负载均衡、源站應用。搜尋引擎蜘蛛走的是和普通訪客基本相同的鏈路,不會因為 UA 是蜘蛛就自動绕開。因此,如果這條鏈路只對“看起来像真人”的請求友好,蜘蛛就容易吃閉门羹。
CDN 缓存:命中不回源意味着什么
缓存命中时,蜘蛛拿到的是邊缘节点上的副本,源站發生了什么變化它並不知道。以下几個情况比較常见:
- 缓存時間過長:新投放的 URL 第一次被訪問时可能拿到舊内容,或者舊狀態碼。
- 404 被缓存:部分配置會把错誤頁也缓存下来,後来頁面已经恢复正常,蜘蛛看到的仍是 404。
- 跳轉被缓存:301、302 一旦被邊缘节点记住,後續再想改回原始狀態會比較被動。
一個相對稳妥的做法是:投放用的目錄、入口頁這類 HTML 文档設定較短的缓存時間,或者直接不缓存 HTML,只缓存静態资源。這样蜘蛛每次来訪都能看到較新的狀態。
WAF 與频率限制
防護层本意是挡異常流量,但規則寫得粗,蜘蛛也會被一起挡掉。常见的三類:
- 频率阈值過低:蜘蛛短時間内並發抓取多個 URL,触發限速後返回 403 或 429。
- 特征規則:把非浏览器 UA、缺少某些請求头的訪問直接判為異常。
- 驗證挑战頁:JS 挑战或驗證碼頁面需要执行脚本才能通過,蜘蛛不执行 JS,通常直接卡在這里。
如果确實需要放行,建议以已经驗證過的蜘蛛 IP 段為主要依據,配合 UA 做二次判断,不要只凭 UA 放行,因為 UA 本身是可以伪造的。
几種容易被忽略的情况
- 站点只保留 HTTPS,但蜘蛛訪問 HTTP 版本时被重定向到一個並不存在的地址。
- 防盗鏈規則把蜘蛛請求里缺失或異常的 Referer 判成盗用。
- 负载均衡的健康检查路径與投放目錄重合,互相干扰。
- CDN 只開了部分节点或部分区域,某些来源的蜘蛛根本连不通。
- 缓存预热没做,蜘蛛刚好撞上回源高峰,拿到超时响應。
一套可执行的排查顺序
- 先看訪問日誌,統計蜘蛛請求的响應碼分布,重点關注 403、429、503 的占比,以及是否集中在某個時間段。
- 對同一個 URL,分別用浏览器和蜘蛛 UA 請求一次,對比狀態碼、响應体和响應头是否一致。
- 检查缓存头的 max-age、s-maxage 設定,確認 HTML 是否被長缓存。
- 在防護层临时放行一小段測試路径,观察抓取是否恢复;如果恢复,問题基本可以定位在防護或缓存規則上。
- 調整規則後维持一段時間,再回看日誌,確認响應碼分布稳定下来。
投放只是把入口摆好,鏈路通畅才是前提。與其急着扩大投放量,不如先確認蜘蛛每次来訪都能拿到正确、稳定的响應。