服務器過载、重啟或临时维護时,抓取請求往往會集中撞上同一個時間窗口。這时怎么回應蜘蛛,會直接影响它接下来是否繼續抓、隔多久再来,以及會不會把暂时狀態誤判成永久問题。
503 和 500 不是一回事
500 表示服務器内部错誤,通常意味着代碼或配置出了問题,蜘蛛很难判断下次重试是否有意义。503 表示服務暂时不可用,语义上更接近“現在不行,稍後可能可以”。
如果站点只是短暂過载,返回 503 比返回 500 更准确。搜尋引擎看到 503 时,一般會把它当作临时狀態,减少或暫停對目前 URL 的抓取,過一段時間再试。但這不是保證,長期 503 也可能被当作不可用。
Retry-After 告诉蜘蛛等多久
503 响應里可以带 Retry-After 响應头,值可以是秒數,也可以是 HTTP 日期。它表達的是“建议在這個時間之後再来”。蜘蛛不一定完全遵守,但相比没有任何提示的 503,它多了一個恢复時間參考。
例如服務器预計维護十分钟,可以返回 503 和 Retry-After: 600。如果维護窗口不确定,不要随便寫一個很小的值,否則蜘蛛可能很快又回来,繼續加重负载。
不要用 503 掩盖其他狀態
有些站点為了减少抓取,會把本该 404 的頁面返回 503,或者把空頁面返回 200。這两種做法都會让蜘蛛對站点狀態产生错誤判断。404 應该保持 404,503 只用于真實的临时不可用。
另外,如果某個频道長期返回 503,蜘蛛可能逐渐降低訪問频率,甚至暂时不把它当作可抓取入口。恢复之後,抓取路径需要重新被確認,内鏈和 Sitemap 里的入口可以帮上忙。
與 429、Crawl-delay 的区別
- 429:請求過多,通常针對單個爬虫或来源,表示“你太快了”。
- Crawl-delay:寫在 robots.txt 里,属于長期限速约定,不是實时回應。
- 503 + Retry-After:服務器端临时不可用,表達“整個服務現在處理不過来”。
三者可以配合,但不要混用。把 429 寫成 503,蜘蛛可能會按临时故障處理,而不是按抓取频率調整。
维護窗口中的几個實用做法
- 計划维護提前准备 503 頁面,並带上合理的 Retry-After。
- 不要返回 200 的“维護中”空頁面,這會让蜘蛛把空内容当成正常頁面。
- 监控抓取日誌里的 503 比例,恢复後观察蜘蛛是否重新訪問關键入口頁。
- 如果只是部分接口過载,尽量缩小 503 的范围,不要全站返回。
503 是临时信号,不是長期挡抓取的工具。用错狀態碼,蜘蛛看到的是另一套站点狀態。
服務器稳定性是抓取路径的基础。蜘蛛愿意按路径往前走,前提是每一步都能得到明确回應。過载时给出准确的 503 和 Retry-After,比直接断開连接或返回模糊的 500 更容易让後續抓取回到正轨。