頁面内容本身没問题,抓取却總是不顺,問题有时出在看不见的地方——HTTP 响應头。响應头是服務器给爬虫和浏览器的第一层說明,狀態碼只是其中一行,字符集、缓存校驗、抓取指令同样寫在這里。它不占頁面体积,却直接影响抓取方如何理解一條 URL。下面按几類常见头部逐項梳理。
一、X-Robots-Tag:最容易誤伤的抓取指令
X-Robots-Tag 的作用和頁面里的 meta robots 類似,但寫在响應头中,對图片、PDF、JS 等無法寫 meta 的资源尤其有用。風險也在這里:它作用范围往往由服務器或 CDN 配置统一决定,一旦寫错,影响的是整批 URL 而不是單個頁面。
- 只想着屏蔽測試环境或後台目錄,規則却匹配到了正式栏目;
- 临时加了 noindex 做排查,事後忘记移除;
- CDN、反向代理或安全防護层附加了指令,源站配置里看不到;
- 對整站统一加了 noindex,只在少數路径上做了例外。
建议把站内所有 X-Robots-Tag 配置集中记錄一份,注明添加時間、适用范围和负责人。對重要栏目頁、内容頁,抽查確認头部里没有 noindex、none 之類的指令。
二、Content-Type 與字符集
Content-Type 應完整包含類型與字符集,例如 text/html; charset=utf-8。如果只寫 text/html 而頁面又依赖 meta 声明编碼,解析环节多一层判断,遇到编碼不一致时容易出現乱碼,影响正文识別。常见的坑是把 sitemap.xml、robots.txt 返回成 text/html,或把 JSON 接口返回成 text/plain,虽然未必立刻出错,但會增加解析歧义。
三、Last-Modified 與 ETag
這两個头部用于判断资源是否發生變化。Last-Modified 缺失时,抓取方难以知道頁面何时更新;時間被统一寫成服務器目前時間,則每次訪問都像刚改過,反而失去參考價值。ETag 如果由多台机器各自生成,同一頁面可能返回不同的值,容易出現無意义的重复拉取。内容更新後,這两個值應当跟着變化;内容没變,則保持一致。
四、Vary 與缓存相關头部
Vary 用来告诉缓存:同一 URL 在不同請求头下可能返回不同内容。對按设备、語言或登入狀態返回不同 HTML 的站点,缺少正确的 Vary 會让缓存把某一版本發给所有訪問者,抓取到的内容與预期不符。同时留意 Cache-Control 的取值,過長的缓存時間會让更新後的内容延迟生效,過短則增加回源压力。
五、一條可以直接执行的自查清單
- 列出站内所有會寫入响應头的环节:源站、反向代理、CDN、安全防護。
- 抽查首頁、主要栏目頁、内容頁、图片與 PDF 各若干條,確認没有意外的不索引指令。
- 確認 HTML 返回的 Content-Type 带正确字符集。
- 確認動態頁面有合理的 Last-Modified 或 ETag,且更新後數值會變。
- 確認需要区分版本的頁面配置了 Vary。
- 把以上配置寫進改版與上线流程,避免只在出問题时临时排查。
六、怎么快速检查
命令行下用 curl -I 加上目标地址,即可只取响應头,不必下载正文;對比不同路径的返回结果,差异通常一眼可见。浏览器開發者工具的 Network 面板也能看到同样的信息,适合核對單頁。若站点走 CDN,建议分別請求源站與 CDN 地址,確認两處头部一致。
响應头的調整往往牵一發動全身,改動前先记錄原始配置,改完後用同一批 URL 复检一遍,比事後凭印象回溯要可靠得多。
响應头不會让内容變好,但它决定了内容能不能被正确讀到。把這項检查纳入日常巡检,付出的時間不多,却能挡掉不少莫名其妙的抓取問题。