蜘蛛抓取一個 URL 时,最先拿到的不是頁面内容,而是服務器返回的狀態碼。這個三位數字决定了它接下来是繼續解析頁面、暂时离開,還是把這條 URL 标记成需要移除。很多看起来像“蜘蛛不来”的問题,實际原因是狀態碼给错了信号。
404 和 410 都表示“没了”,但语气不同
两者都會让蜘蛛把该 URL 從抓取队列里去掉,但表達的含义有差別:
- 404:资源目前不存在。适合内容临时下线、地址寫错、參數组合無意义的情况。蜘蛛會在一段時間内保持观察,如果長期返回 404,權重會被逐步释放。
- 410:资源已永久刪除,不會再回来。适合明确下架的内容。它比 404 更干脆,蜘蛛通常不再反复回訪。
如果只是改版換址,正确做法是 301 而不是 404。用 404 代替跳轉,等于把老 URL 积累的連結關系直接丢掉,同时让内鏈變成死鏈。
软 404:返回 200 的空壳頁面
這是最容易被忽略的一類問题。頁面内容已经不存在,但服務器依然返回 200,頁面里寫着“内容已刪除”“该商品下架”,或者只剩導航和頁脚。蜘蛛讀到 200,會認為這是一個正常頁面,于是照常解析、照常收錄,甚至持續回訪。
狀態碼寫 200,頁面却没有實质内容,蜘蛛既拿不到有效信息,又浪費了一次抓取机會。這類頁面积累得多,會明顯拉低整站的抓取效率。
常见的软 404 来源:篩選參數组合出来的空结果頁、已下架的商品詳情、被清空但没删模板的栏目頁、登入後才能看但未做拦截的頁面。處理方式是让這些 URL 真正返回 404 或 410,而不是停留在 200。
503 和 429:临时不可用时给出明确信号
服務器维護、短时過载、正在迁移,這類情况不應返回 200 空頁,也不该直接 404。更合适的做法是:
- 503:服務暂时不可用。配合 Retry-After 头告诉蜘蛛多久後可以再来,能减少無谓重试。
- 429:請求過于频繁。适合對高频訪問做限速时使用。
需要注意,503 只适合短時間使用。如果長期挂着 503,蜘蛛會逐步降低抓取频率,恢复後需要一段時間才能回到原来的节奏。
跳轉狀態碼:別让蜘蛛在鏈上耗時間
301 是永久跳轉,302、307 是临时跳轉。内容确實換了地址用 301;只是活動頁、临时 A/B 測試用 302。要避免的是跳轉鏈:A 跳到 B,B 又跳到 C。蜘蛛每次都要多走一步,跳轉层級越深,URL 被發現和被传递的效果越差。内鏈和 Sitemap 里應尽量直接指向最终地址。
怎么發現狀態碼問题
- 看抓取日誌:統計蜘蛛拿到的狀態碼分布,重点看 200 但内容很薄的那一批。
- 用抓取工具批量請求站点主要 URL,比對返回碼與頁面實际内容是否一致。
- 检查内鏈:站内連結指向的地址如果返回 404 或跳轉,會直接浪費抓取预算。
- 检查 Sitemap:里面列的 URL 應全部返回 200,不要把跳轉地址或已刪除頁面留在清單里。
改完狀態碼,内鏈和 Sitemap 要同步更新
狀態碼修正往往只是第一步。如果一個栏目整体下线,除了让頁面返回 410,還要把指向它的内鏈改成有效地址或移除,把 Sitemap 里的條目删掉,並在相關頁面留下通往其他内容的出口。否則蜘蛛顺着舊連結反复撞墙,URL 發現的效率依然上不去。
狀態碼本身不复杂,难的是保持一致性:服務器返回什么、頁面上實际有什么、内鏈和 Sitemap 指向哪里,這三者對齐了,蜘蛛的抓取路径才會顺畅。