先给结论:不要直接比较两台设备上看到的页面,而要把“请求身份”固定下来再对照。同一 URL 在未登录、已登录、移动端、桌面端可能返回不同 HTML,但 robots.txt 是站点级文件,通常不因设备或登录状态变化。真正需要对照的是:你抓取到的内容是否属于爬虫可见版本,以及该版本上是否还有指向被限制路径的链接。做法是分别保存每个身份下的响应头、状态码和正文摘要,再判断差异来自服务端分流还是 robots 规则本身。
把问题拆成三层:robots.txt 文件本身、被请求的页面、页面里的链接。多数人卡住,是因为把三层混在一起看。
判断依据很简单:如果 robots.txt 的响应体在不同身份下完全一致,差异就不在协议层,而在页面层。此时先别改规则,先确认爬虫拿到的是哪个版本。
对同一个 URL,至少取三份记录:匿名桌面、匿名移动 UA、已登录会话。每份记录包含四项,缺一项后面的判断就不可靠。
实际动作:用同一台机器、同一网络,只改变 UA 或 Cookie,各请求一次,把结果存成三个文件。做完这一步,你会得到一张对照表。如果三个文件的正文特征片段相同,说明分流没有影响爬虫可见内容,问题可能出在别处,例如链接被 JavaScript 注入。如果不同,就进入下一步判断。
响应头里的 Vary 是判断分流意图的直接证据。它列出服务端认为会影响响应的请求头。
Vary: User-Agent:说明服务端按 UA 返回不同内容。此时要确认爬虫 UA 命中的是哪个版本,而不是假设它和浏览器一致。Vary: Cookie 或响应中带 Set-Cookie:说明登录态会改变输出,匿名抓取看到的是未登录版本。这里有一个容易误判的点:某次抓取返回 200 且正文为空,不等于页面被 robots 阻止。空正文还可能来自渲染失败、接口鉴权失败或缓存了错误版本。robots.txt 的抓取限制不等于可靠的索引移除,反过来,抓取成功也不代表内容会被收录。
假设某页面 /guide/start 在匿名桌面浏览器显示完整教程,在移动 UA 下只显示摘要,登录后显示全部。你怀疑移动版本被 robots 规则挡住。
/robots.txt,分别用桌面 UA 和移动 UA,比较两份规则文本。若文本一致,协议层无差异。/guide/start,保存三份正文。发现移动版正文缺少主区块,且响应头含 Vary: User-Agent。这个顺序的关键是:先排除协议层,再处理内容分流。顺序颠倒会浪费大量时间在改规则上,而问题根本不在规则。
三种结果对应三种动作。
站点地图不保证收录,提交了正确的地图也不能替代上述对照。不同搜索引擎对 UA 识别和内容分流的处理须分别核查,不能用一个引擎的表现推断另一个。
最后提醒一点:如果同一地址在不同身份下返回不同内容,先固定请求身份、保存可复查的记录,再决定是改 robots 规则、改服务端分流,还是改页面输出。顺序对了,才能把一次异常变成可复用的对照方法,而不是反复试错。