很多人在调蜘蛛池时会盯着入口页的链接和内容,却忽略了一个不起眼的细节:HTTP 响应头里的缓存字段。它不直接决定搜索蜘蛛来不来,但会影响蜘蛛再次访问同一个入口页时的判断——页面到底变没变,值不值得重新解析一次。
搜索蜘蛛怎么判断入口页有没有更新
搜索蜘蛛并不是每次回访都完整下载整页内容。当它已经持有这个 URL 的缓存副本时,通常会带上 If-Modified-Since(对应 Last-Modified)或 If-None-Match(对应 ETag)来询问服务器:这个页面变了吗?服务器如果回 304 Not Modified,蜘蛛就知道内容没变,多数情况下会跳过解析,只更新一下抓取记录。
Last-Modified 和 ETag 分别管什么
- Last-Modified:页面上次修改的时间,精度到秒,适合更新不频繁的静态入口页。
- ETag:内容指纹,内容变则值变,对模板化生成、时间戳固定的页面更准确。
- 两者可以同时存在,蜘蛛一般会优先用 ETag 做判断。
304 响应本身不是坏事
304 是省流量的正常机制,不会因为出现 304 就让蜘蛛降低抓取频率。真正要留意的是另一种情况:入口页明明新加了指向目标 URL 的链接,服务器却因为缓存配置没跟上,依旧回 304。蜘蛛会以为页面没变,新链接自然也就不会被发现。
几种容易踩坑的缓存写法
- 缓存时间设置过长,页面已经改过但响应头没更新,蜘蛛一直拿到旧的 304。
- ETag 每次请求都重新生成,例如掺入随机数或请求时间,蜘蛛每次都判定内容已变,白白消耗抓取预算。
- Last-Modified 写成未来时间或每次都是服务器当前时间,蜘蛛会反复回访确认。
- 整站套用统一的静态缓存策略,入口页更新后没有及时刷新缓存节点或 CDN。
缓存头是给搜索蜘蛛省成本用的,不是用来催它来的工具。把响应头写准,比反复调整抓取节奏更实在。
实操上的排查顺序
- 先用命令行工具请求入口页,看响应头里的 Last-Modified、ETag、Cache-Control 是否符合预期。
- 手动带上 If-Modified-Since 再请求一次,确认内容变化后服务器返回的是 200 和新内容,而不是 304。
- 检查入口页更新后,CDN、反向代理和程序内缓存有没有同步失效。
- 如果入口页由程序动态生成,确认 ETag 不是每次都在变的随机值,可以按内容哈希计算。
- 把入口页的访问日志与响应状态对照着看,统计 304 与 200 的比例是否合理。
别把缓存头的作用想得太大
缓存配置只影响蜘蛛“要不要重新解析”这一小步。入口页能否被稳定抓取、目标 URL 是否值得跟进,仍然取决于入口页本身能否正常访问、链接结构是否清晰、目标站是否允许抓取。基础问题解决之后,再回头优化响应头,收益才比较明显。
如果发现蜘蛛回访频率持续偏低,优先排查的应该是入口页是否可访问、是否被 robots.txt 拦住、是否存在大量重复内容,而不是先去改 Cache-Control。顺序搞反,容易白折腾一场。