蜘蛛抓取一個站点,本质上是一连串 HTTP 請求串起来的路径:首頁到列表頁,列表頁到詳情頁,中間可能還夹着分頁、篩選參數和静態资源。這條路径能不能走完,不只取决于連結有没有寫對,還取决于每一步的服務器响應稳不稳。連結结构再漂亮,响應一慢,路径照样會從中途断掉。
一次抓取失敗,断的是整條线
蜘蛛不是先規划好完整路线再出發,而是走到哪算哪。目前頁面請求成功,它才會解析出連結、把新 URL 放進队列。如果某一步拿到超时、连接被重置或者 5xx,這一跳之後的連結就都不會被發現,只能等下次重訪。
所以路径上的每個节点都接近于單点:断在列表頁,後面所有詳情頁一起消失;断在分頁第二頁,後面的列表就全看不到了。
服務器變慢时,蜘蛛會怎么調整
- 先降速:响應時間拉長,抓取速率會跟着压下来,單位時間能走完的路径變短。
- 再重试:5xx 和超时通常會被安排重试,重试次數與間隔由搜尋引擎决定,站点很难干预。
- 然後收缩:持續表現不稳定的目錄或參數,抓取優先級容易被下調。
- 最後是路径整体變窄:原本能走到第四层的,可能停在第二层就折返。
這個過程通常是渐進的,不會一次跳變,所以很容易被忽略,直到某天發現新頁面收錄明顯變慢,才回头查服務器。
同样慢的情况下,哪一截最先断
超时阈值對所有 URL 大致相同,但不同頁面熬過阈值的能力差別很大:
- 動態參數頁:带篩選、排序參數的 URL 往往响應最慢,最先被放弃。
- 深层頁面:路径本来就長,優先級靠後,抓取频率低,失敗後拿到重试的机會也少。
- 分頁尾部:第三頁往後本来就少被抓,一抖動更容易彻底掉队。
- 大文件與图片:單個請求耗时長,會挤占同一時間段内的抓取額度。
站点侧能做的几件事
- 把關键路径上的頁面响應压到几百毫秒内,TTFB 是最该先看的指标。
- 给列表頁、分頁和热门詳情頁加缓存,避免每次抓取都打到資料库。
- 避免整站同时變慢:慢查询、定时任務、备份尽量错開抓取高峰。
- 确實要临时下线,用 503 並带上 Retry-After 响應头,比直接 200 返回一個空頁面更清楚。
限流要按来源区分
站点的防護策略如果對所有来源一视同仁,蜘蛛很容易被誤伤,表現為間歇性的连接被拒或响應极慢。给已知的搜尋引擎来源保留稳定的响應通道,比事後逐個加白名單更省事。
怎么確認問题出在服務器而不是連結
两件事可以對照着看:一是日誌里搜尋引擎来源的响應碼分布,5xx 與超时的占比是否在上升;二是這些失敗請求集中在哪些目錄、哪些參數上。如果失敗集中在動態參數頁,多半是服務器侧的問题;如果失敗集中在某一层級的静態頁面,優先回头检查内鏈和路径设計。
抓取路径不是画在纸上的图,而是一次次真實請求跑出来的结果。服務器稳不稳,直接决定了這張图能画多深。