robots 里写了官方文档没有的指令,爬虫会不会照做
robots.txt 里写了官方文档没有的指令,不能假定爬虫会支持或照做。搜索引擎一侧的口径很明确:没有被官方文档收录的指令,就不应假定它被解析和遵循。非标准写法能不能生效,取决于每一家抓取程序自己的实现,而不是配置文件里那行文字看起来有多合理。
官方到底支持哪些 robots 指令
可依赖的范围只有文档里逐项列出的字段:用户组匹配、允许与禁止路径、站点地图声明,以及少数几家单独声明的扩展。判定标准不是「别家支持过」,而是「这一家在自己的文档里承诺了」。
这意味着同一段 robots 文本,在不同抓取程序上的效果可能不一致。做多引擎站点时,把控制目标写成每家都支持的子集,比逐家堆私有指令更稳定。
非标准指令的三种结局
| 结局 | 表现 | 风险 |
|---|---|---|
| 被忽略 | 爬虫按其余规则继续抓取 | 你以为拦住了,实际没有拦 |
| 被部分支持 | 只在某一家爬虫上生效 | 多引擎口径分裂,难以复现 |
| 解析中断 | 未知语法导致后续行被跳过 | 同文件里的正规规则一起失效 |
最麻烦的是第三种。一些解析器遇到无法识别的字段会跳过整段,结果原本写对的禁止路径也失效了。这类问题不会报错,只能靠核对抓取记录发现。
想达到的效果该用哪种写法
先确定目标落在哪一层,再选工具:
- 不想让某个路径被抓取:用文档内的禁止路径规则,按用户组分别写。
- 不想让某个页面被索引:抓取拦截与索引拦截是两件事,禁止抓取反而可能让页面带着外部链接继续存在于索引里,此时应回到 301 重定向或权限控制。
- 想改变 URL 形态:这属于伪静态规则的职责,写在站点配置里,让对外地址与内部路由一一对应,robots 只负责声明哪些路径不抓取。
- 想让新页面被及时发现:交给站点地图与链接推送,robots 里保留站点地图声明即可。
在 AnQiCMS 后台,robots 配置、伪静态规则与站点地图生成分布在三个位置,好处是每层的产出可单独核对;坏处是容易把某一层的诉求写到另一层去,比如把「页面不该出现」写成 robots 里的一行私有指令。
声明之外还要做什么
把核对动作固定成两步:一是改动 robots 之后,观察抓取日志里各家爬虫的实际请求分布是否发生变化;二是检查生成的站点地图是否仍只包含可正常访问的地址。两者都比读配置文件更能说明结果。
另外,控制可见性的手段不要只押在 robots 上。对确实不该对外的内容,用访问权限或状态位让页面本身不可达,比依赖某一行指令被理解更可靠。
常见问题
问:私有指令写了会有惩罚吗? 答:没有惩罚,问题在于它可能不被执行,甚至影响同文件其余规则的解析,导致你以为生效的拦截实际失效。
问:多个爬虫要分别控制怎么办? 答:按用户组分别写段落,每组只用该家文档确认支持的字段;不要指望一条通用私有指令覆盖所有家。
问:怎么确认指令被不被读? 答:以抓取日志为准,对比改动前后的请求分布;配置文件文本本身无法证明结果。