為什么响應头容易被忽略
大多數人排查抓取問题,第一反應是打開頁面源碼,检查連結、canonical、meta robots。但蜘蛛在拿到 HTML 之前,先收到的是服務器返回的响應头。這部分信息不顯示在頁面上,也不會被普通用戶看到,却直接决定了蜘蛛接下来怎么處理這個 URL:是解析成網頁,還是当成文件下载;是允许索引,還是直接跳過;是立刻重试,還是等一段時間再来。
下面這些头字段,日常配置里出問题的概率不低,值得單獨拿出来看一眼。
X-Robots-Tag:寫在头里的抓取指令
meta robots 需要蜘蛛解析到 HTML 才能生效,X-Robots-Tag 則在响應头阶段就已经說明態度。它對以下场景特別有用:
- 非 HTML 文件,比如 PDF、图片、压缩包,頁面里没地方寫 meta;
- 整站或某個目錄统一設定規則,不用逐頁改模板;
- CDN 或反向代理层面加規則,不需要動源站代碼。
常见寫法是 noindex,也可以带 UA 限定,只對特定蜘蛛生效。需要注意的是,如果同一個 URL 上同时存在 meta robots 和 X-Robots-Tag,两者會叠加,只要有一個寫了 noindex,通常就會按 noindex 處理。改配置时別只删了一處。
Content-Type 與字符集:决定蜘蛛怎么讀這份内容
声明成 text/html 的响應,蜘蛛會当網頁解析;如果寫成 application/octet-stream 或 text/plain,就可能被当成文件或纯文本,連結和结构都不會被正常提取。字符集声明错誤則容易出現乱碼,标题、正文、連結文字都可能變样。HTML 里的 meta charset 和响應头里的 charset 要一致,源站、CDN、後端模板三處都检查一遍,尤其是做了压缩或轉碼的鏈路。
Retry-After:告诉蜘蛛什么时候再来
返回 429 或 503 时,可以带上 Retry-After,给一個秒數或具体時間。這比让蜘蛛自己猜要友好得多。如果服務器正在维護或临时限流,寫一個合理的等待時間,比反复返回 5xx 更有利于後續回訪节奏。時間別寫得太短,也別寫得太長,几分钟到几小时比較常见。
Location 與跳轉:蜘蛛看到的是第一步
3xx 响應里的 Location 决定蜘蛛下一步去哪。多級跳轉、跳轉到無關頁面、跳轉鏈里夹着 noindex,都會让抓取路径變長甚至断掉。改版时如果舊地址要批量跳轉,尽量让每一步都指向最终地址,而不是 A 跳 B、B 跳 C。另外,跳轉目标如果是 404 或 5xx,蜘蛛會把這個结果记在跳轉鏈上。
缓存相關头:影响回訪时的判断
Cache-Control、ETag、Last-Modified 這几個字段配合起来,决定了蜘蛛再次請求同一 URL 时是否拿到 304。304 本身是好事,說明内容没變,可以节省传輸;但如果缓存策略把動態内容缓存太久,蜘蛛可能一直看到舊版本,新發布的内容迟迟不進入抓取视野。動態頁面和列表頁要特別注意 CDN 的缓存規則。
Vary:同一個 URL 的多個版本
Vary: User-Agent 常见于移動适配或按设备返回不同内容的站点。對蜘蛛来说,這意味着同一個地址可能返回两份不同的 HTML。如果移動版和桌面版的連結、内容差异較大,而站点又没有清晰的自适應或獨立移動域名策略,蜘蛛在不同 UA 下看到的頁面可能不一致,抓取和归並都會變得复杂。能做成响應式就尽量做成响應式。
排查时的几個動作
- 用 curl -I 或浏览器開發者工具的網絡面板,看响應头原文,不要只看狀態碼。
- 對比蜘蛛 UA 和普通浏览器 UA 請求同一 URL 的差异,特別是 Vary 或按 UA 返回内容的站点。
- 检查 CDN 是否改寫、覆盖了源站的响應头,尤其是 X-Robots-Tag 和 Cache-Control。
- 抽查 PDF、JS、CSS 等非 HTML 资源的 Content-Type,避免本應被解析的资源被当成下载文件。
- 改完配置後,用日誌观察蜘蛛對同一 URL 的後續請求,確認狀態碼和行為符合预期。
小结
响應头是蜘蛛進入頁面之前的第一段信息,它决定了内容以什么形式被讀取、是否被允许索引、什么时候可以再来。把狀態碼、Content-Type、X-Robots-Tag、Retry-After 這几項检查清楚,很多抓取異常可以在源头找到原因,而不是等到日誌里出現大批失敗請求才回头排查。
提示:响應头的修改通常涉及源站、反向代理和 CDN 多层,改動後建议同时核對三层返回的结果,避免只在某一层生效。