搜尋抓取

响應头里的抓取信号:蜘蛛在解析正文之前先看什么

抓取問题往往先被归因到正文、内鏈或 meta 标簽,HTTP 响應头這一层却常被跳過。本文說明 Last-Modified、ETag、Content-Type、X-Robots-Tag 以及重定向、Retry-After、缓存头如何影响蜘蛛的判断與下一次来訪,並给出一份可以照着跑的自查清單。

搜尋抓取

响應头里的抓取信号:蜘蛛在解析正文之前先看什么

排查抓取問题的时候,注意力通常放在正文、meta 标簽和内鏈结构上,HTTP 响應头這一层基本被跳過。但蜘蛛在决定一個 URL 要不要抓、抓回来怎么處理、下次還来不来的时候,最先讀到的恰恰是响應头。字段配置不對,正文寫得再细也可能白費。

Last-Modified 與 ETag:帮蜘蛛少抓一次

這两個字段不决定收錄,但會影响蜘蛛重复訪問时的判断成本。

  • Last-Modified:如果每次請求都返回目前時間,蜘蛛會認為頁面一直在變,于是更频繁地回来,抓取预算被消耗在没有實质更新的頁面上。合理做法是返回内容真正變更的時間。
  • ETag:内容未變时應保持稳定,配合 If-None-Match 請求,服務器可以返回 304,避免重复下载完整正文。反過来,把 ETag 生成成随机的、每次請求都不同的字符串,等于持續告诉蜘蛛“内容又變了”。
  • 两個字段互相矛盾时(Last-Modified 没變、ETag 却變了)容易造成判断混乱,建议保持同步更新。

Content-Type:返回類型不對,抓取會被中断

蜘蛛需要靠 Content-Type 判断這個响應该按 HTML 解析,還是当成文件下载。常见問题有三類:

  • 頁面返回 text/plain 或 application/octet-stream,蜘蛛可能直接放弃解析,内容等于没被抓到。
  • 字符集声明缺失,或與正文實际编碼不一致,抓到的文本可能是乱碼,影响後續判断。
  • 類型声明為 text/html,但正文為空或只有一小段占位内容,容易被当作软 404 處理。

排查方式很直接:用 curl -I 或者浏览器開發者工具的網絡面板,看响應头和正文類型是否對得上。

X-Robots-Tag:寫在 HTTP 里的 robots 指令

這個字段的作用和頁面里的 meta robots 類似,但寫在响應头里,對蜘蛛更早可见,也能作用到 PDF、图片這類没法插入 meta 的文件。

如果某個目錄批量配置了 X-Robots-Tag: noindex,頁面本身看不出任何異常,但抓取與展現都會受影响。遇到“頁面正常却不被收錄”的情况,這一項值得優先检查。

同时要留意別在不需要的地方沿用 nofollow、noarchive 等指令,尤其是從舊站点或模板里複製過来的配置。

重定向與 Retry-After:影响下一次来訪

301、302 的 Location 头如果指向已经不存在的地址,或者形成多級跳轉,URL 發現的损耗會一层层累积。服務端临时不可用时,返回 503 並带上 Retry-After,比直接给 500 更友好:蜘蛛知道大概等多久再来,而不是把這次失敗当成頁面真的下线。

缓存相關头部(Cache-Control、Vary、Age)不直接决定抓取,但如果 CDN 把一份错誤响應缓存住,蜘蛛和用戶都會持續拿到同一份坏结果,排查时非常容易走偏。

一份快速自查清單

  1. 用 curl -I 检查核心頁面,確認狀態碼、Content-Type 和字符集。
  2. 隔一段時間請求两次,對比 Last-Modified 與 ETag,確認内容未變时這两個值不會随便變動。
  3. 全量检索服務器與 CDN 配置,找出所有 X-Robots-Tag,逐條確認是否仍然需要。
  4. 检查 5xx 场景是否返回了合理的 Retry-After,而不是長期挂着一份错誤頁。
  5. 確認 CDN 缓存策略與源站响應头一致,避免错誤响應被長時間缓存。

响應头不需要天天盯,但每次改版、迁移、調整缓存策略之後過一遍,能省掉不少“頁面看起来没問题、蜘蛛就是不来”的排查時間。