robots 里拦了训练爬虫,为什么抓取还是拿不到内容
robots.txt 里已经拦了训练爬虫,为什么抓取侧还是拿不到可用内容?因为这两个问题分属不同层:前者问的是”我允不允许你抓”,后者问的是”你真的抓到了什么”。同一批两千三百余个站点的实测里,在文本里拦住训练类爬虫的只占百分之三点六,而按真实访客身份直接取首页时,有百分之十八点八拿不到可用内容。数字方向相反,说明缺口出在执行与可用性,不在规则文本。
两个百分比为什么不能互换
拦住的比例低、取不到内容的比例高,这两件事各自有不同成因,不能互相推断。
拦住的比例低,可能是因为多数站点还没针对新的访客类型改配置,也可能是改法只在文本里生效。取不到内容的比例高,成因更杂:页面依赖脚本渲染、地址跳转层级过深、返回的状态码不是正常成功、需要登录才能看到正文,都会导致”允许抓但抓不到”。
把两者混起来最常见的误判是:以为自己已经做了防护,就认定外部读不到内容;或者反过来,看到有人能读,就以为规则写错了。这两类结论都要用抓取行为本身去验证,而不是用配置文本去验证。
拦了却仍能取到内容的三种情况
第一种是身份校验缺失。规则按访客名称匹配,但实际访问可以自称任意名称,服务端如果只按名称判定,改名就能绕过。真正生效的拦截要看请求来源、频率与行为特征,而不是只看名称字段。
第二种是同一内容有多个入口。列表页、接口地址、旧域名、内容分发节点缓存都可能返回同一份正文,规则只覆盖了其中一条路径。这种情况下,拦住的是一条入口,其余入口仍然可取。
第三种是渲染层差异。抓取用的取页方式与浏览器不同,没有执行脚本时返回的是骨架内容,看起来”取到了”但正文为空。这类问题在验证时最容易被忽略,因为它返回的状态码是正常的。
按四类信号自查的顺序
顺序应当从外到内,四类信号依次核对。
先看规则文本:目标目录是否写全、名称匹配是否与真实访客一致、放行与拦截冲突时以哪条为准。文本层面 AnQiCMS 的 robots 配置可以直接在后台核对,改完要确认线上文件与后台设置是同一份。
再看入口清单:把站点地图、接口地址、旧域名跳转、缓存节点列出来,逐个确认它们受同一套规则约束。第三步看返回质量:用自己的身份直接取首页与几个内页,看正文是否完整、是否需要脚本才出现、状态码是否稳定。第四步看行为特征:如果同一地址在短时间内被大量不同来源访问,说明规则没有真正生效,需要在服务端加限制。
站内要配套的两层防护
抓取层的核对之外,站内还有两层与内容可辨识度相关。
第一层是敏感词过滤与内容审核。公开接口返回的内容与前台正文一致时,任何一层缺失都可能让低质量内容进入抓取结果;把审核规则配置好,同时避免在正文里混入只给前台看的占位文字。
第二层是防采集与干扰码。它的作用不是替代 robots,而是让批量搬运在内容质量上失去价值:抄走的页面带着无意义字符,重新发布时读起来不连贯。这一层要按访客类型区别配置,避免把正常抓取也一并干扰,否则”取不到内容”的比例反而由自己造成。
两层配置之后,仍要按前面那四类信号复测一次,因为改配置最容易引入的新问题就是规则冲突与入口遗漏。
常见问题
只改 robots 能不能挡住训练抓取? 不能算可靠。名称可以被伪造,同一内容也可能从别的入口被取走,robots 更适合当作声明层,配合服务端的来源与行为限制。
放行侧要验证到什么程度? 至少验证到”正文完整可见”。状态码正常不等于内容可用,抓取用的取页方式常不执行脚本,需要确认返回体里有完整段落。
多久复测一次? 按配置变动触发更合理:改了规则、加了新入口、换了域名或上了缓存之后各复测一次;平时按季度做一次全量核对。