搜尋抓取

响應头里的 URL 發現线索:Link、X-Robots-Tag 與缓存头怎么配合

URL 發現不只依赖 Sitemap 和内鏈,服務器返回的响應头同样是爬虫每次請求都會讀到的信息。本文梳理 Link 头、X-Robots-Tag 與缓存头三類字段的作用,說明它們如何补充發現通道、又容易在哪些配置细节上挡住抓取,並给出一份可落地的检查清單。

搜尋抓取

响應头里的 URL 發現线索:Link、X-Robots-Tag 與缓存头怎么配合

聊 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 的时長同样值得關注。設定得過短,回源压力大,爬虫訪問时更容易遇到缓慢响應;設定得過長,又要確認更新發布後能及时刷新缓存,否則爬虫讀到的是舊版本。

几個具体的检查点

  1. 随机抽几個頁面,用命令行工具或浏览器開發者工具查看响應头,確認没有意外的 noindex 字段。
  2. 检查 CDN 與源站是否返回同一套 X-Robots-Tag,避免回源版本與缓存版本不一致。
  3. 確認 ETag 在内容未變时保持稳定,内容更新後才發生變化。
  4. 需要被發現的 PDF、图片目錄,可以评估用 Link 头补充 canonical 或 alternate。
  5. 改動屏蔽規則後,隔几天回看服務器日誌,確認目标路径的抓取量變化符合预期。

两個常见誤区

  • 把 Link 头当成提交入口,以為寫了就會被收錄。它只是补充說明资源關系,發現仍然要靠内鏈、站点地图等通道共同作用。
  • 在 404 或 5xx 响應上也带 noindex,想借此加速清理。狀態碼本身已经表達了地址失效,額外叠加指令反而可能让爬虫對整段路径的判断變得混乱。
响應头不产生新内容,也不替代内鏈和站点地图。它更像是给爬虫的一句备注:這個地址是什么、和谁有關、現在要不要重新讀一遍。

把响應头纳入日常检查,成本並不高,用一次批量抓取就能拿到全部字段。真正需要花心思的是改動之前的评估:一條規則會命中多少地址,其中有多少是你希望被發現的。想清楚這一点,再動手調整配置,URL 發現的通道才不會被自己關掉。