很多站点把注意力放在正文和連結上,却忽略了服務器返回的那几行响應头。蜘蛛拿到的第一份信息就是响應头:内容是什么類型、能不能索引、有没有更新、要不要稍後再来。這些字段一旦寫错或前後矛盾,蜘蛛的判断就會跟着偏。
Content-Type 與字符集:先说清楚這是什么
最基础的一條是 Content-Type。它告诉蜘蛛這是一個 HTML 頁面、一張图片還是一份文件。如果 CMS 或服務器把 HTML 頁面返回成 text/plain,蜘蛛看到的就可能是一堆源碼文本,正文解析容易出問题。
字符集同样重要。中文站点如果声明與實际编碼不一致,頁面會出現乱碼,标题和正文的识別都會受影响。建议在响應头里明确 charset=utf-8,並與頁面内的 meta 声明保持一致,不要一處寫 utf-8、另一處寫 gb2312。
X-Robots-Tag:看不见的 meta robots
meta robots 寫在 HTML 里,而 X-Robots-Tag 寫在响應头里,作用相同,優先級更高。常见用法是给某個目錄下的 PDF、图片统一加 noindex,避免它們進入索引。
風險也在這里:這個字段常常由运维或安全策略顺手加上,运营同学並不知情。一旦全站响應头里带了 noindex,頁面看起来正常,索引却會慢慢清空。排查抓取異常时,建议用命令行工具看一眼响應头,確認没有意外的 X-Robots-Tag。
Last-Modified 與 ETag:让蜘蛛知道頁面有没有變
這两個字段支持條件請求。蜘蛛再次訪問时带上 If-Modified-Since 或 If-None-Match,服務器如果發現内容没變就返回 304,既省带宽,也让蜘蛛把抓取预算留给別的頁面。
需要注意的是別让它們乱跳。有些站点每次請求都重新生成 ETag,或者把 Last-Modified 设成目前時間,蜘蛛每次都被判定為有新内容,于是反复抓取同一個頁面。稳定、真實的更新時間更有價值。
Vary 與内容协商:同一個 URL 给出几套内容
如果服務器根據 User-Agent 或 Cookie 返回不同版本,比如给移動端返回简化版、给未登入用戶返回另一套模板,需要通過 Vary 說明依據。否則缓存和蜘蛛都可能拿到不符合预期的版本。這類差异化最好控制在必要范围内,主体内容尽量保持一致。
限流與 Retry-After:礼貌地告诉蜘蛛慢一点
当服務器压力大时,返回 429 或 503 並附带 Retry-After,比直接超时更友好,蜘蛛會按提示稍後再来。相反,如果長期用 403 或 429 打發所有請求,抓取量下降是自然结果。
另外,返回 503 时不要同时带上 noindex,短暂的维護不该被理解成永久下线。
Link 头:另一種传递 canonical 的方式
對非 HTML 文件,比如 PDF,頁面里没法寫 canonical,可以用 Link 响應头指向規范版本。如果响應头里的規范地址和 HTML 里的 canonical 指向不同位置,蜘蛛就會收到矛盾信号,至少要让两者保持一致。
一份可执行的自查清單
- 抽查首頁、栏目頁、詳情頁的响應头,確認 Content-Type 為 text/html 且字符集正确。
- 全站搜尋 X-Robots-Tag,排除被批量加上 noindex、nofollow 的情况。
- 检查 Last-Modified 與 ETag 是否稳定,是否支持返回 304。
- 確認 Vary 設定與實际的差异化返回逻辑匹配。
- 维護期間返回 503 加 Retry-After,而不是 200 或 403。
- canonical 的响應头寫法與 HTML 寫法保持一致。
响應头是蜘蛛看到的第一句话。與其事後從日誌里猜它為什么不来,不如先把這句话说清楚。
這些字段平时不會出現在後台界面里,改動也常常是顺手為之,所以更需要定期抽查。把响應头纳入站点运营的日常检查項,抓取上的很多“莫名其妙”,其實都能在這里找到解释。