先给有条件的结论:如果两个地址返回的正文内容完全一致,但响应头不同,那么可以确定“内容相同”这个判断本身仍然成立,但“它们应当被当作同一个页面处理”这个判断不成立。响应头差异会直接影响爬虫对页面身份、可索引状态和规范版本的认定,而提交工具通常只负责把地址送出去,不负责替你判断这些差异是否构成问题。
正文相同只说明渲染后或源码中的可见内容一致,它属于内容层面的证据。响应头属于传输层面的证据,爬虫在拿到正文之前先读到它。两者冲突时,传输层往往先被采信,因为它决定这次响应要不要继续按页面处理。
几个常见字段会直接改变判断方向:
Content-Type 不同:一个声明为 text/html,另一个声明为别的类型,即使字节相同,后者也可能不被当作 HTML 页面解析。X-Robots-Tag 不同:一个带 noindex,另一个不带,那么带 noindex 的那个不会被索引,哪怕正文一模一样。Link 或规范相关头不同:一个指向 A 作为规范版本,另一个指向 B,两者会被要求归到不同规范地址。也就是说,页面内容相同只排除了“内容重复”这一种解释,它不能排除“索引状态不同”“规范目标不同”“可抓取性不同”。把这两类判断混在一起,是常规做法反复尝试却不见效的常见原因。
上述结论有一个明确前提:差异出现在与索引和抓取相关的响应头上。如果两个响应的差异只落在与页面处理无关的字段上,比如缓存策略、时间戳、连接相关的头,那么“不该当作同一页面处理”这个结论就不成立。
举例来说,假设两个地址正文相同,一个响应头里 Cache-Control 是 max-age=600,另一个是 no-cache,其余头完全一致。这种情况下,页面的身份判断、索引状态和规范版本都不会因此改变,缓存差异影响的是取回路径,而不是页面归属。此时若仍然按“响应头不同就要拆开处理”去操作,反而会把一个本来正常的页面改乱。
所以判断的第一步不是“头有没有不同”,而是“不同的头是否落在身份、索引、规范、状态码这四类上”。落在这四类上,结论成立;只落在缓存、时间、连接类字段上,结论失效。
不要同时改多个头去试。先固定正文,只比较响应头,并记录每个地址返回的状态码和关键头字段。这个动作的结果会直接决定下一步:
X-Robots-Tag 不同,下一步应当确认哪个地址才是希望被索引的版本,再决定去掉哪一个的 noindex。这个动作的价值在于:它把“页面内容相同但表现不同”拆成可分别验证的几类原因。只有先确认差异落在哪一类,后面的处理才不会互相干扰。
URL提交工具的作用是通知抓取,它不改变响应头,也不替你决定哪个地址是规范版本。因此当问题出在响应头差异时,反复提交同一个地址通常不会带来变化,因为抓取方每次拿到的仍然是同样的传输层信号。
可以这样区分:提交工具解决的是“这个地址有没有被注意到”,响应头差异解决的是“这个地址被注意到之后按什么身份处理”。前者有效不代表后者已经正确。把提交当作修复手段,容易掩盖真正的分歧点。
另外要留意,抓取限制、索引移除和提交是不同层面的事。即便某个地址被限制抓取,也不等于它一定从索引中消失;反过来,提交成功也不保证收录。这些现象只能作为线索,不能单独当作判断依据。
建议按固定顺序推进,每一步的结果决定是否进入下一步:
Content-Type、X-Robots-Tag、规范相关头,标出真正不同的字段。按这个顺序做,能避免把传输层问题当成内容问题处理,也能避免在差异无关紧要时做多余改动。判断的起点始终是:正文相同只证明内容一致,响应头才决定这次响应被当成什么来处理。