聊 URL 發現时,多數人把注意力放在 Sitemap、内鏈和提交接口上,很少回头看服務器返回的响應头。其實响應头是爬虫每次請求都會讀到的内容,它既可能帮着把新地址带進抓取队列,也可能在不经意間把整段路径挡在门外。
Link 响應头:不占頁面位置的补充通道
Link 头的作用是告诉客戶端“這個资源還和哪些地址有關”,格式大致為 Link: <目标地址>; rel="關系類型"。和 URL 發現關系比較近的几種關系類型有:
- rel="canonical":把規范化信息放到 HTTP 层,适合 PDF、图片這類没有 head 的资源,或者不便改動模板的頁面。
- rel="next" / rel="prev":标注分頁序列。主流搜尋引擎已不再把它当作索引信号,但對爬虫理解列表翻頁顺序仍有參考價值。
- rel="alternate":多語言版本、移動版與桌面版的對應關系,也可以在头部声明。
- rel="preload" / rel="preconnect":主要服務性能,但頁面渲染變快,間接有利于抓取时的解析。
需要留意的是,Link 头只能表達“關系”,不能替代頁面里可见的連結。如果某個地址只出現在响應头中,站内任何頁面都没有指向它的可点击連結,它的發現優先級通常仍然偏低。
X-Robots-Tag:覆盖面比 meta 标簽更广
meta robots 只能寫在 HTML 的 head 里,而 X-Robots-Tag 是响應头字段,因此可以作用在图片、PDF、视频等没有 head 的资源上,也能按目錄批量下發。常见的取值包括:
- noindex:允许抓取,但不進入索引;
- nofollow:不追踪该响應内頁面上的連結;
- none:等價于 noindex 與 nofollow 同时生效。
配置时最容易出問题的是匹配規則寫得太宽。比如為了屏蔽内部搜尋參數,把規則寫成匹配所有带問号的地址,结果把正常分頁、追踪參數甚至部分詳情頁一起挡掉,URL 發現自然就断了。改動前建议先用少量 URL 做驗證,確認命中范围符合预期再全量下發。
缓存头:让爬虫少花力气重复下载
ETag 和 Last-Modified 的作用,是让爬虫用條件請求判断内容有没有變。服務端返回 304 Not Modified 时,传輸体积很小,爬虫能確認頁面没有更新,把抓取額度留给別處。
反過来,如果每次請求都返回不同的 ETag,或者 Last-Modified 一直跟着目前時間走,爬虫就無法通過條件請求得出“未修改”的结论,只能整頁重新下载。對内容量大的站点,這會持續消耗抓取资源,新地址排队的空間也被压缩。
Cache-Control 的时長同样值得關注。設定得過短,回源压力大,爬虫訪問时更容易遇到缓慢响應;設定得過長,又要確認更新發布後能及时刷新缓存,否則爬虫讀到的是舊版本。
几個具体的检查点
- 随机抽几個頁面,用命令行工具或浏览器開發者工具查看响應头,確認没有意外的 noindex 字段。
- 检查 CDN 與源站是否返回同一套 X-Robots-Tag,避免回源版本與缓存版本不一致。
- 確認 ETag 在内容未變时保持稳定,内容更新後才發生變化。
- 需要被發現的 PDF、图片目錄,可以评估用 Link 头补充 canonical 或 alternate。
- 改動屏蔽規則後,隔几天回看服務器日誌,確認目标路径的抓取量變化符合预期。
两個常见誤区
- 把 Link 头当成提交入口,以為寫了就會被收錄。它只是补充說明资源關系,發現仍然要靠内鏈、站点地图等通道共同作用。
- 在 404 或 5xx 响應上也带 noindex,想借此加速清理。狀態碼本身已经表達了地址失效,額外叠加指令反而可能让爬虫對整段路径的判断變得混乱。
响應头不产生新内容,也不替代内鏈和站点地图。它更像是给爬虫的一句备注:這個地址是什么、和谁有關、現在要不要重新讀一遍。
把响應头纳入日常检查,成本並不高,用一次批量抓取就能拿到全部字段。真正需要花心思的是改動之前的评估:一條規則會命中多少地址,其中有多少是你希望被發現的。想清楚這一点,再動手調整配置,URL 發現的通道才不會被自己關掉。