先固定一个可复核的请求条件,再把同一地址在不同设备或登录状态下的返回内容并排保存,最后只比较差异部分。外链域名查询在这里的作用是确认差异是否来自页面本身,而不是来自跳转链、缓存或权限层。
同一地址返回不同内容,常见原因有四类:设备类型触发的不同模板、登录状态触发的权限差异、缓存或CDN节点差异、以及跳转链在某一端被改写。对照前先判断属于哪一类,因为不同类别的比较对象不同。
如果差异同时涉及设备和登录,先固定设备再切换登录状态,不要两个变量一起动。否则无法判断差异由哪一个条件引起。
这种情况下,优先怀疑权限控制或个性化模块。实施动作是:用未登录状态请求一次,保存完整响应;再用已登录状态请求同一地址,保存完整响应。把两份内容中指向外部域名的链接提取出来,按域名归并,标出只在一份中出现的域名。
结果如何影响下一步:如果只在未登录状态出现的域名集中在导航或推荐位,说明这些链接对爬虫可见、对登录用户不可见,需要确认这是否是预期行为。如果只在已登录状态出现,则这些链接很可能不会被外部抓取工具看到,对照时不应把它们计入公开可见的外链集合。
这种情况下,优先怀疑响应式模板或UA分流。实施动作是:用两种设备标识请求同一地址,保存两份响应,逐段比对链接区块。不要只看渲染后的画面,要看返回的HTML里是否已经包含目标链接。
结果如何影响下一步:如果目标链接只存在于其中一份HTML中,说明该链接的可发现性依赖设备条件。此时需要决定以哪一份作为对照基准。通常以公开抓取工具默认使用的条件为基准,另一份作为例外记录,而不是两份混在一起统计。
当多个角色对同一地址的外链情况说法不一致时,不要争论谁的观察正确,而是把分歧拆成可以逐项核对的条件组合。建议按以下顺序记录:
每一项都写成可重复执行的动作,而不是结论。例如写“未登录、移动端标识请求,返回正文包含域名A和域名B”,而不是写“移动端有外链”。这样其他人可以按同样条件复现,分歧会收敛到具体条件上,而不是停留在印象层面。
有些差异无法通过固定条件消除,需要单独标注为例外。例如页面内容依赖地理位置、依赖A/B测试分组、或依赖实时接口返回。这类情况下,同一条件多次请求也可能得到不同结果,对照的意义从“找出唯一正确版本”变成“记录可能出现的版本范围”。
另外,抓取限制和索引状态是两件事。robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。对照外链内容时,如果发现某域名在源码中存在但未被外部工具列出,不能直接断定是工具遗漏,还需要确认该链接是否可被抓取、是否被跳转、是否在登录后才出现。
假设一个场景:同一地址在未登录桌面端返回的HTML中包含三个外部域名,在已登录桌面端只包含一个。按上述方法记录后,可以确认差异来自登录状态而非设备。下一步就是决定以未登录版本作为公开可见外链的对照基准,并把已登录版本的差异作为权限层记录单独保存,而不是把两个版本合并成一个列表。这个判断只依赖已保存的响应内容,不依赖任何工具的功能声明。