百度爬虫:页面内容相同但响应头不同会影响哪些判断

📍 WDQWDWQD987AAAAA:216.73.217.134
📱 Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
🔗 /c5ac441fa04a.html
📄

百度爬虫:页面内容相同但响应头不同会影响哪些判断

内容字节完全一致的两个响应,只要响应头不同,百度爬虫侧可能做出不同判断:是否继续抓取、是否把新响应视作同一资源、以及是否值得进入后续处理。若你已经在做常规排查仍未解决,先别改正文,把同一 URL 的两份响应头并列比对,通常更快定位遗漏条件。

先固定比较对象,避免把不同 URL 混在一起

取你手中一个具体页面,例如 /product/list?page=2。用同一请求方式、同一 UA、同一时刻各取一次响应,保存完整头字段。不要拿桌面 UA 与移动 UA 的两份结果直接对比,那会同时引入 UA 差异,无法判断响应头本身的作用。

把两次结果整理为三列:字段名、响应 A 的值、响应 B 的值。只保留有差异的行。常见差异集中在 Content-Type、Content-Encoding、Vary、Cache-Control、ETag、Last-Modified、Set-Cookie、X-Robots-Tag 以及重定向状态码。先不解释,只记录差异,这是后续判断的原始依据。

响应头差异会改变哪些判断

资源类型与解码

Content-Type 声明为 text/html 还是 application/json,会影响爬虫把响应当作页面还是数据。若同一 URL 在不同条件下返回不同类型,爬虫可能按其中一种处理,另一种响应里的可见内容就不一定被当作页面正文。此时先确认:你希望被当作页面处理的那份响应,是否稳定返回 HTML 类型。

内容协商与缓存键

Vary 告诉缓存和中间层:同一 URL 会因哪些请求头而返回不同内容。Vary: User-Agent 或 Vary: Accept-Encoding 存在时,同一 URL 的不同请求可能落到不同缓存副本。若两份响应正文相同但 Vary 不同,缓存命中路径会改变,爬虫下次取到的可能是另一份头,而不是你刚修好的那份。

校验与新鲜度

ETag 与 Last-Modified 决定条件请求能否返回 304。内容相同但这两个值不同,爬虫可能认为资源已变化而重新取全文;反之,若值相同而内容实际已变,爬虫可能继续使用旧副本。判断时把这两个字段与正文哈希一起看,不要只看其中一个。

抓取指令与状态

X-Robots-Tag 放在响应头里,作用范围可与页面内 meta 不同。同一内容一份响应带 noindex、另一份不带,爬虫对是否保留该资源的判断就会分叉。重定向状态码(301、302、307)也会改变爬虫把哪个 URL 视作目标。这里要区分:robots.txt 的抓取限制不等于可靠的索引移除,响应头里的指令和 robots 规则解决的是不同层面的问题。

用一份可执行清单把差异转成动作

  1. 对同一 URL 取两份响应,标注触发条件(UA、Accept-Encoding、Cookie、时间)。
  2. 逐字段列出差异,标出哪些差异由服务端配置产生,哪些由 CDN 或反向代理追加。
  3. 对每个差异问一句:它是否会让爬虫把这次响应归入不同资源或不同处理分支。
  4. 只改一个变量后复取,确认差异行是否收敛。若未收敛,说明还有上游层在改写响应头。
  5. 把稳定后的响应头与正文哈希一起记录,作为下一次比对的基线。

假设一个场景:某列表页在无 Cookie 时返回 Cache-Control: public,带 Cookie 时返回 Cache-Control: private,正文相同。若爬虫请求恰好带上 Cookie,中间层可能不缓存该响应,源站压力与响应时间随之变化。此时下一步不是改正文,而是确认爬虫请求是否真的会携带该 Cookie,以及能否让两类请求都落到同一份可缓存响应上。

怎样判断差异是否真的影响结果

不要仅凭请求量或抓取量归零就断定处理正确。抓取量下降还可能来自配额调整、站点整体抓取节奏变化、URL 发现减少或服务端限流。更稳的做法是:固定一组样本 URL,在改动前后各取一次响应头与正文哈希,观察差异字段是否收敛,以及样本 URL 的抓取记录是否出现对应变化。只有字段收敛与抓取行为变化同时出现,才更支持“响应头差异是影响因素”这一判断。

站点地图不保证收录,HTTPS 也不保证安全无漏洞或排名提升。这些结论与响应头判断无关,不应混入同一次比较。若你的页面依赖客户端渲染,还要确认爬虫取到的 HTML 与用户可见内容是否一致,因为响应头相同并不代表渲染结果相同。

把上面这份比对记录保存下来,下一次遇到“内容没改但表现变了”的情况,先查差异行,再决定是改服务端配置、改缓存策略,还是继续排查抓取与渲染环节。

图1 图2

nginx