先固定一个可复现的请求条件,再逐项改变设备标识与登录状态,把每次返回的正文、状态码和跳转目标记录下来对照。不要用浏览器肉眼判断,因为同一地址在移动端、桌面端、登录态下可能返回完全不同的内容,而爬虫通常只取其中一种。
对照的目的决定你该模拟谁。如果怀疑移动端内容没被正确抓取,就以移动端用户代理发起请求;如果怀疑登录后内容被误抓,就以未登录状态发起请求。这两者的选择依据不同,不能混用同一套结论。
选择依据可以概括为:你关心的是“内容差异”还是“访问权限差异”。前者优先固定登录状态、只切换设备;后者优先固定设备、只切换登录状态。把两个变量同时改动,得到的差异无法归因。
实际动作是:对同一地址依次发起至少四次请求,分别组合桌面未登录、桌面登录、移动未登录、移动登录,并保存每次的响应状态码、最终 URL 和正文片段。可以用命令行工具完成,例如:
curl -A "移动端UA" -I https://example.com/page
先看响应头中的状态码和 Location,再看正文首屏是否包含目标信息。动作的结果会直接影响下一步:如果四次请求返回的正文主体一致,差异只在样式或脚本,问题通常不在内容分发;如果正文主体不同,就要继续判断差异来自服务端渲染、客户端渲染还是缓存。
记录时至少保留三项证据:请求时间、完整用户代理、是否携带会话 Cookie。缺少任一项,后续对照都会失去可复查性。
同一地址返回不同内容,常见原因有三类,对照方法也不同。
这三种解释对应的处理动作不同:设备分流要检查内容是否对爬虫可见;登录态差异要检查是否误把需登录内容暴露或误挡;缓存差异要检查缓存键是否包含了不该包含的维度。把原因归错,后续修改可能修错地方。
上述对照方法成立的前提是你能控制请求头和会话状态。如果页面内容完全依赖客户端脚本渲染,直接抓取 HTML 只能看到空壳,此时需要改用能执行脚本的请求方式,或对比渲染后的 DOM。另一个例外是站点对同一地址做了基于地域或时间的返回,这类差异不在设备与登录状态范围内,需要另设变量核验。
还要注意,robots.txt 的抓取限制不等于可靠的索引移除,它只约束合规爬虫的抓取行为,不能替代 noindex 或权限控制。同理,站点地图不保证收录,提交地址与最终是否被抓取、被索引是不同环节。核验差异时不要把这些信号混入同一结论。
如果对照后发现只有登录态返回了完整内容,而爬虫以未登录身份访问,那么需要决定是让未登录版本也包含核心信息,还是接受该内容不被抓取。这个取舍取决于内容是否必须登录才能查看,以及是否已有其他可公开访问的对应页面。做出决定后,重新用同一套四次请求记录验证,确认修改只影响了目标条件,没有波及其他条件。