先给结论:不要试图让两种状态“对齐成一份页面”,而要先确认差异是服务端主动分流还是客户端渲染差异。前者需要固定一个基准身份做对照,后者需要固定设备与网络环境。如果两者混在一起测,你看到的差异既无法复现,也无法判断该改哪一层。VIP域名选择这类站点常见的分流来源包括登录态、会员等级、地区、UA 与缓存键,遗漏其中任何一个都会让对照失效。
用同一个 URL,在两种条件下各取一次原始响应,比较响应体而不是渲染后的画面。判断依据可以这样分:
这个区分决定了下一步该抓什么。服务端分流要抓请求头与 Cookie;客户端差异要抓渲染后的 DOM,并确认脚本是否依赖登录接口。
条件一:差异出现在原始响应体中。此时应选择抓源码,并且把请求头、Cookie、IP 归属一起记录。只抓源码不记录请求条件,等于拿到一份无法复现的快照。执行动作是固定一个基准身份(例如未登录、无 Cookie、指定 UA),再逐项改变单一变量,每次只动一个。结果如何影响下一步:如果改变 Cookie 后响应体变化,说明分流由会话驱动,后续对照必须锁定会话;如果改变 UA 后变化,说明存在设备或爬虫识别逻辑,需要把 UA 纳入基准条件。
条件二:响应体相同但渲染结果不同。此时应选择抓渲染后 DOM,并固定设备类型、视口宽度与网络环境。执行动作是在同一浏览器配置下分别以登录和未登录状态渲染,导出可见文本做逐段比对。结果如何影响下一步:若差异只出现在登录后,说明内容依赖接口返回,源码对照没有意义;若两种状态渲染一致,则说明此前的差异来自缓存或临时状态,应转向缓存层排查。
常规做法失效,通常是因为对照时没有固定全部变量。可以按以下顺序逐项排除,每次只改一项:
假设一个例子:某 VIP 域名选择页面在未登录时返回通用介绍,登录后返回会员专属说明。若你只在登录状态下抓取,会误以为该 URL 的内容就是会员版;若只在未登录状态抓取,又会漏掉实际面向会员的那部分。此时正确的做法是两种状态各存一份快照,并注明各自的请求条件,而不是合并成一份“最终版”。
如果确认差异由登录态驱动,那么面向未登录访问者的可见内容才是默认版本,登录版属于个性化结果。后续动作应针对默认版本做可索引性检查,而不是试图让登录版也被抓取。如果确认差异由设备或 UA 驱动,需要判断这是有意的适配还是误判,前者应保持分流逻辑一致,后者应修正识别规则。如果差异只出现在客户端渲染之后,那么源码层面的调整不会改变用户看到的内容,应转向脚本与接口层。
需要留意的例外:robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录,HTTPS 同样不保证内容一致或排名。这些手段都不能替代对分流条件的实际对照。另外,请求量或抓取量归零不能单独证明处理正确,它也可能是抓取预算转移、缓存命中或统计口径变化造成的,需要结合响应体对照一起判断。
在改动任何分流规则前,先保存两种状态下的原始响应与渲染快照,并标注采集时间、请求头、Cookie 状态与网络出口。改动后重复同一组采集,逐项比对差异是否收敛。这样做的结果是:如果改动引入了新的差异,你能立刻定位到是哪一项条件变化导致的,而不是在多个变量之间反复猜测。对于 VIP 域名选择这类分流维度较多的站点,这一步比直接调整页面内容更能减少返工。