先给结论:不要试图让蜘蛛以“登录用户”或“某台设备”的身份去抓取。正确做法是把同一地址在不同设备、不同登录状态下返回的差异记录下来,找出哪一版才是你希望被抓取的版本,然后让服务端对未登录、无设备标识的请求稳定返回这一版。下面用一个假设情境把决策过程走完。
假设某页面 /article/42 在桌面浏览器打开时,正文区域是空的,只有一句“请用手机访问”;在手机浏览器打开时正文完整;登录后再打开,正文之外还多出一块“我的收藏”。现在的问题是:蜘蛛抓到的到底是哪一版?三版内容差异这么大,对照该从哪里下手。
这个情境里其实混了两个变量:设备类型和登录状态。对照的第一步不是去猜蜘蛛像什么,而是把这两个变量拆开,分别固定其中一个,观察另一个带来的变化。拆不开,后面的判断都会互相污染。
缺少日志权限时,仍可以用命令行请求同一地址,通过改变请求头来模拟不同状态。关键是每次只改一个变量,并把响应体保存下来,而不是只看浏览器里显示的样子。
把三份响应分别存成文件后做文本对比,看差异是集中在正文、导航,还是只差几个展示字段。如果“无标识”那一版和手机版正文一致,说明设备判断没有拦住内容;如果它和桌面版一致、正文为空,说明服务端默认把无标识请求当成了桌面端。
这一步的实际动作是保存三份响应并逐行比对。它的直接结果是:你能明确说出差异发生在哪个变量上,而不是笼统地说“蜘蛛看到的不一样”。这个结论会决定下一步是改设备判断,还是改登录判断。
不是所有差异都要消除。需要区分三种情况。
只有第二类才值得投入改动。把第一类和第三类也当成问题去处理,往往会把页面改得更复杂,反而制造新的不稳定。
假设对照后发现,无设备标识的请求返回的是空正文版。合理的动作是调整服务端的设备判断逻辑,让无法识别设备类型的请求落到完整内容版,而不是落到精简版。改完后重新取一次无标识响应,确认正文出现,再对比手机版是否仍一致。
这里要注意一个容易被忽略的点:robots.txt 里的抓取限制只能约束合规爬虫的访问路径,它并不等于可靠的索引移除手段。也就是说,即使你用 robots.txt 挡住了某个参数版本,也不能据此认为搜索结果里一定不会出现对应内容。同理,站点地图提交也不保证收录,它只是提供候选地址。对照工作的目标是让可抓取的那一版内容完整、稳定,而不是靠这些文件去“控制”结果。
如果拿不到服务器日志,也没有后台的抓取统计,仍然可以完成上面第一步的对照,因为它是从外部发请求、看响应。能得到的结论是:某个请求头组合会返回哪一版内容。不能得到的是:蜘蛛实际用了哪种请求头、多久来一次、是否已经抓过某一版。请求量或抓取量归零也有多种解释,比如流量本身下降、抓取预算被分到别的路径、或者统计口径变化,单凭这一点不能证明你的修改是对的。
另外,如果页面同时存在 HTTP 和 HTTPS 两个可访问地址,不要默认 HTTPS 就一定安全或一定更受青睐;证书配置、跳转链、混合内容都可能带来新的对照变量。把协议也当成一个需要固定的条件,而不是想当然的前提。不同搜索引擎对同一套请求头、同一段脚本的处理方式需要分别核查,不能拿一个引擎的表现去推断另一个。
回到那个假设情境:三份响应比对后,如果差异只在登录版多出的收藏模块,那正文本身没有问题,不必改动;如果无标识版正文为空,就调整设备判断,让默认请求拿到完整正文,然后再取一次响应确认。这个顺序能让你在权限有限的情况下,仍然拿到可复查的证据,并知道下一步该动哪里。