搜索抓取

robots.txt 挡住了抓取,但挡不住 URL 发现:容易踩坑的几个细节

robots.txt 常被当成收录开关,但它约束的只是抓取行为,并不能阻止 URL 被链接发现。本文梳理 Disallow、Sitemap 声明、Crawl-delay 等常见写法对 URL 发现的实际影响,以及 robots.txt 自身返回异常时蜘蛛会怎么处理,并给出更稳妥的配置思路。

搜索抓取

robots.txt 挡住了抓取,但挡不住 URL 发现:容易踩坑的几个细节

在讨论搜索蜘蛛时,robots.txt 经常被当成一个开关:写上 Disallow,就觉得这个页面从此从搜索引擎里消失了。实际情况比这复杂——robots.txt 约束的是抓取行为,不是 URL 的发现。把这两件事分开看,很多“明明屏蔽了却还是有痕迹”的现象就有了解释。

发现、排队、抓取,是三件独立的事

一个 URL 进入搜索引擎的流程大致是:被发现(来自内链、外链、Sitemap、站点地图之外的推送渠道等)→ 进入待抓取队列 → 蜘蛛按计划发起请求 → 内容被解析 → 决定是否进入索引。robots.txt 只作用在第三步,也就是“这次请求能不能读到内容”。

所以一个被 Disallow 的 URL,依然可能因为别处有链接而被发现、被放进队列。它不会被抓取,但如果外部链接的锚文本足够明确,搜索引擎仍可能把它当成一个“已知但未抓取”的地址保留在结果里,表现出来就是只显示 URL、没有摘要。

robots.txt 里几条常见写法的影响

Disallow:阻止抓取,不阻止发现

Disallow 只是告诉蜘蛛“别请求这个路径”。它不删除已经存在的记录,也不切断别人指向它的链接。新 URL 照样可能通过站外链接、历史 Sitemap、社交分享被纳入已知集合,只是抓取阶段被拦下。

Sitemap 声明:最容易被忽视的一行

在 robots.txt 末尾写上 Sitemap 地址,相当于把 URL 发现的一个入口直接摆在蜘蛛面前,省掉一次“先找到、再验证”的环节。它不保证任何页面被抓取,但确实减少了发现成本。对多域名、多子目录的站点,这条声明的价值更明显。

Crawl-delay:并不是所有蜘蛛都认

主流搜索引擎的蜘蛛对 Crawl-delay 的遵循程度并不一致,有的直接忽略,抓取节奏更多由其自身根据服务器响应速度动态调整。想控制抓取压力,比起写死一个 delay 值,更有效的是先把响应时间稳住。

分组写法要成对

只写 Disallow 不写 User-agent、或者把多个规则拆成互相矛盾的多个分组,容易让解析结果和预期不一致。最稳妥的写法是每个 User-agent 分组下面只放该组自己的规则,不依赖解析器的“就近合并”行为。

当 robots.txt 自己拿不到时

如果 robots.txt 返回 5xx 或者请求超时,主流蜘蛛的保守做法是暂停对该站点的抓取,而不是当作“全部允许”随意抓。返回 404 则一般被视为没有规则,可以正常抓取。这一点在服务器不稳定、CDN 回源异常或者防火墙误拦时特别容易踩坑:一次临时的 5xx,可能让整站抓取停摆一段时间,恢复后还要重新爬升。

还有一类情况是 robots.txt 被放在需要登录、需要脚本渲染或者被 WAF 挑战页拦截的路径上,蜘蛛拿到的是挑战页而不是规则文本,解析结果往往不可预期。

更稳妥的配置思路

  • 想彻底不索引,优先用 noindex 或 410/404,而不是只用 Disallow。Disallow 会让蜘蛛看不到页面里的 noindex,两者叠加时常常互相抵消。
  • 不要整站一刀切 Disallow。那会连带切断内链路径,目录里的其他页面也可能因此更难被发现。
  • 把 Sitemap 地址写进 robots.txt,减少一次发现环节,同时保证 Sitemap 文件本身可正常访问。
  • 保持 robots.txt 静态可读,不要依赖动态参数、登录态或前端渲染。
  • 改完规则后看抓取日志,确认蜘蛛的请求量、状态码分布和路径覆盖符合预期,而不是改完就放着。

几个判断口径

  1. 某个 URL 要从索引中移除:优先 410/404 或 noindex,Disallow 排在后面。
  2. 某个目录只是不想被频繁抓取:可以用 Disallow 或调低抓取压力,但要接受它仍可能被链接、被发现。
  3. 想控制抓取节奏:先从日志里找到真实的请求峰值和响应时间,再决定措施,而不是只加一行 Crawl-delay。
robots.txt 是一份给蜘蛛的请求说明,不是贴在站点的封条。把“发现”和“抓取”分开对待,很多看起来矛盾的现象就能对上号。