蜘蛛抓取一個頁面,很少是孤立的一次請求。它更像一條路径:蜘蛛從某個入口發現 URL,顺着連結或 Sitemap 走到目标頁,再把頁面里的連結解析成新的候選地址。這條路径上任何一段断開,後面的頁面就可能一直待在队列外面。下面按路径的顺序,拆一下常见的断点。
一條抓取路径由哪几段组成
- 發現:蜘蛛從外鏈、Sitemap、站内連結或提交入口拿到一個 URL。
- 請求:向服務器發起請求,经過 DNS、连接、TLS,拿到响應。
- 解析:讀取 HTML,提取出可以繼續跟進的連結。
- 入队:把新發現的 URL 放進待抓取队列,等待調度。
- 回訪:根據更新节奏再次請求,確認内容是否發生變化。
排查时不必一次看全,先確認断在哪一段,再往下查會更省時間。
断点一:入口頁没有有效抓到
如果入口頁本身抓不到,後面的頁面基本不會被發現。常见情况是入口頁返回 4xx 或 5xx,或者需要用參數、Cookie、登入態才能打開。另一種情况是入口頁被 robots.txt 屏蔽:此时蜘蛛不會抓取该頁内容,頁面上寫着的連結也就讀不到。需要注意的是,外部指向被屏蔽 URL 的連結仍然能让蜘蛛知道這個地址存在,但它無法通過這個頁面繼續向内走。
断点二:連結存在但触發不到
有些入口寫在 JS 里,需要点击、滚動或接口請求才生成。蜘蛛在渲染环节可能执行不到這一步,看到的就是一個空壳。表單提交、下拉篩選、需要悬停才出現的菜單也属于這類。如果希望這些入口被走到,最好在初始 HTML 里就给出可点击的 a 标簽,並保證 href 是真實地址,而不是 javascript 伪协议或 onclick 事件。
断点三:連結可達但响應拖慢了路径
跳轉层級過多會让蜘蛛在中間頁消耗請求。301 一层接一层,或者 http 到 https、带 www 到不带 www 反复跳,都會让同一批 URL 的抓取效率下降。服務器返回 5xx 或長時間不响應时,蜘蛛通常不會一直等,會降低對這台服務器的請求频率,恢复後再逐步提速。也就是说,稳定性問题不只影响当下這次抓取,還會影响接下来一段時間的抓取节奏。
断点四:到了頁面,連結被指令截断
連結上加了 nofollow,蜘蛛通常不會沿着它繼續發現新地址;頁面級 meta robots 设為 noindex 时,頁面仍可能被抓取,但不會進入索引,之後的回訪频率也容易下降。這两類指令不等于路径立刻消失,但會让路径的延伸價值變小。
断点五:抓到頁面却解析不出新連結
内容放在 iframe 里、連結需要登入才能看到、正文由接口异步填充,都會让解析环节拿不到可用的連結。這種頁面在日誌里看是 200,但抓取范围並不會因此扩大。
一份實用的巡检清單
- 取最近一段時間的服務器日誌,筛出蜘蛛的請求,看哪些目錄只有入口請求、没有後續請求。
- 抽样几條路径,手動從首頁点到目标頁,记錄中間经過的跳轉和狀態碼。
- 检查入口頁是否依赖 JS 交互,確認初始 HTML 中是否有可用的 a 标簽。
- 核對 Sitemap 里的 URL 是否都能返回 200,以及是否和站内連結指向同一地址形式。
- 观察重要頁面的回訪間隔,判断是抓取频率問题,還是路径本身走不通。
抓取路径的连贯性,往往比單点優化更容易见效。先把一條從入口到目标頁的鏈路打通,再考虑扩大抓取范围。