robots txt协议,同一地址因设备或登录状态返回不同内容怎样对照

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

robots txt协议,同一地址因设备或登录状态返回不同内容怎样对照

先给结论:不要直接比较两台设备上看到的页面,而要把“请求身份”固定下来再对照。同一 URL 在未登录、已登录、移动端、桌面端可能返回不同 HTML,但 robots.txt 是站点级文件,通常不因设备或登录状态变化。真正需要对照的是:你抓取到的内容是否属于爬虫可见版本,以及该版本上是否还有指向被限制路径的链接。做法是分别保存每个身份下的响应头、状态码和正文摘要,再判断差异来自服务端分流还是 robots 规则本身。

先确认差异发生在哪一层

把问题拆成三层:robots.txt 文件本身、被请求的页面、页面里的链接。多数人卡住,是因为把三层混在一起看。

判断依据很简单:如果 robots.txt 的响应体在不同身份下完全一致,差异就不在协议层,而在页面层。此时先别改规则,先确认爬虫拿到的是哪个版本。

把每个身份变成一份可对照的记录

对同一个 URL,至少取三份记录:匿名桌面、匿名移动 UA、已登录会话。每份记录包含四项,缺一项后面的判断就不可靠。

  1. 请求时使用的 User-Agent 字符串,原样保存。
  2. 响应状态码与 Content-Type。
  3. 响应头中与缓存、分流相关的字段,例如 Vary、Cache-Control。
  4. 正文中能区分版本的特征片段,比如标题、主区块首句、规范链接。

实际动作:用同一台机器、同一网络,只改变 UA 或 Cookie,各请求一次,把结果存成三个文件。做完这一步,你会得到一张对照表。如果三个文件的正文特征片段相同,说明分流没有影响爬虫可见内容,问题可能出在别处,例如链接被 JavaScript 注入。如果不同,就进入下一步判断。

用 Vary 和缓存线索区分原因

响应头里的 Vary 是判断分流意图的直接证据。它列出服务端认为会影响响应的请求头。

这里有一个容易误判的点:某次抓取返回 200 且正文为空,不等于页面被 robots 阻止。空正文还可能来自渲染失败、接口鉴权失败或缓存了错误版本。robots.txt 的抓取限制不等于可靠的索引移除,反过来,抓取成功也不代表内容会被收录。

一个假设例子的完整对照流程

假设某页面 /guide/start 在匿名桌面浏览器显示完整教程,在移动 UA 下只显示摘要,登录后显示全部。你怀疑移动版本被 robots 规则挡住。

  1. 先请求 /robots.txt,分别用桌面 UA 和移动 UA,比较两份规则文本。若文本一致,协议层无差异。
  2. 再请求 /guide/start,保存三份正文。发现移动版正文缺少主区块,且响应头含 Vary: User-Agent。
  3. 检查移动版正文里是否仍有指向受限路径的链接。若没有,则该版本对抓取的价值有限,需要判断爬虫默认使用哪个 UA。
  4. 若确认爬虫拿到的是摘要版,下一步不是改 robots.txt,而是让服务端对爬虫 UA 返回与匿名桌面一致的正文,或提供可访问的等价内容。

这个顺序的关键是:先排除协议层,再处理内容分流。顺序颠倒会浪费大量时间在改规则上,而问题根本不在规则。

对照结果如何影响下一步

三种结果对应三种动作。

站点地图不保证收录,提交了正确的地图也不能替代上述对照。不同搜索引擎对 UA 识别和内容分流的处理须分别核查,不能用一个引擎的表现推断另一个。

最后提醒一点:如果同一地址在不同身份下返回不同内容,先固定请求身份、保存可复查的记录,再决定是改 robots 规则、改服务端分流,还是改页面输出。顺序对了,才能把一次异常变成可复用的对照方法,而不是反复试错。

图1 图2

nginx