很多站点排查抓取问题时,习惯直接翻 HTML:标题、正文、内链。但蜘蛛在解析 HTML 之前,先拿到的是服务器返回的 HTTP 响应头。响应头里的字段会决定蜘蛛怎么看待这个 URL:是正常页面、跳转,还是暂时不值得继续读;是 HTML 还是别的文件;能不能用缓存副本;下次什么时候再来。下面按蜘蛛的处理顺序,梳理几个值得长期关注的响应头字段。
状态码与 Location:第一层判断
蜘蛛拿到响应后,首先看状态码。200 表示可以继续读响应体;301、302、307、308 表示要跳转,蜘蛛会读 Location 字段,把新地址加入待抓队列。404 和 410 都表示页面不存在,但 410 更明确,蜘蛛通常会更早降低重访频率。5xx 属于服务器错误,蜘蛛一般会保留 URL 并稍后再试,但如果连续多次 5xx,抓取频率可能被调低。
容易出问题的是“200 但没内容”的软 404,以及“302 跳首页”的临时处理。它们不会立刻让蜘蛛放弃 URL,却会让蜘蛛反复来确认,浪费抓取次数。排查时可以按状态码分布拉一份日志,看看是不是大量 URL 长期停在 302 或 200 空页面上。
Content-Type 与字符集
Content-Type 告诉蜘蛛响应体是什么类型。常见的 text/html 表示网页;application/json、text/plain、application/pdf 等会被当作非 HTML 处理。如果服务器把 HTML 页面返回成 text/plain,蜘蛛可能不会按网页解析,页面上的链接也不会被继续发现。
字符集同样重要。Content-Type 里的 charset 如果和页面实际编码不一致,中文内容可能变成乱码,标题和正文的语义识别会受影响。建议在响应头和 HTML meta 中保持一致,避免只靠蜘蛛猜测。
X-Robots-Tag:藏在响应头里的指令
除了 robots.txt 和页面 meta,蜘蛛还会读 X-Robots-Tag。它可以对单个 URL、某类文件或整个目录生效,支持 noindex、nofollow、noarchive 等值。它常被用在 PDF、图片、接口返回的页面上,因为这些文件不方便写 meta。
如果某个页面明明没有写 meta noindex,却一直不出现,可以检查服务器或 CDN 是否加了 X-Robots-Tag。反过来,临时屏蔽时用 X-Robots-Tag 比改页面模板更集中,但要记得删除,避免长期误伤。
Last-Modified、ETag 与 304
Last-Modified 表示页面最后修改时间,ETag 是内容版本标识。蜘蛛再次抓取时会带上 If-Modified-Since 或 If-None-Match,服务器如果判断内容没变,可以返回 304 Not Modified。304 响应没有响应体,蜘蛛会沿用本地缓存版本。对内容更新不频繁的站点,正确返回 304 能减少传输,也能让蜘蛛把时间花在真正变化的 URL 上。
需要注意的是,Last-Modified 不要每次请求都变。如果动态生成的时间戳每次都不同,蜘蛛会以为页面一直在更新,从而频繁重抓。ETag 也不要在多台服务器之间不一致,否则同一 URL 可能被反复当作新内容。
Cache-Control 与 CDN 缓存
Cache-Control 决定中间层能缓存多久。蜘蛛通常不按浏览器缓存逻辑执行,但 CDN 和反向代理会。如果缓存时间过长,蜘蛛抓到的可能是旧版本;如果缓存时间过短,源站压力会上升。更稳妥的做法是让 HTML 的缓存时间短一些,静态资源可以长一些,并在内容更新后主动刷新关键 URL 的缓存。
另外,Vary 字段如果设置不当,可能让同一 URL 因 User-Agent 不同返回不同内容。蜘蛛拿到的版本可能和用户看到的不一样,严重时会被判为伪装。除非确有需要,不建议针对蜘蛛单独返回不同 HTML。
Content-Length 与响应体截断
Content-Length 或分块传输的完整性会影响蜘蛛能读多少内容。如果连接提前中断、响应体被截断,蜘蛛可能只解析到一部分 HTML,后面的链接就发现不了。服务器稳定性、超时设置、压缩配置都可能造成这种情况。排查时可以对比源站返回的字节数和蜘蛛访问日志里的响应大小,看是否存在明显缺口。
一个实用的排查顺序
- 先用具体 URL 请求一次,看状态码和 Location 是否符合预期。
- 检查 Content-Type 与 charset,确认蜘蛛按 HTML 解析。
- 确认没有被 X-Robots-Tag、robots.txt 或 meta 误屏蔽。
- 查看 Last-Modified 和 ETag 是否稳定,304 是否正常。
- 检查 CDN 缓存与 Vary,确认蜘蛛拿到的是当前版本。
- 最后再看响应体是否完整,链接是否出现在 HTML 靠前的位置。
响应头不能直接决定排名,但它决定了蜘蛛能不能顺利读到页面。把这几类字段纳入日常巡检,比等到抓取量下降再去猜原因更有用。