在讨论搜索蜘蛛时,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 静态可读,不要依赖动态参数、登录态或前端渲染。
- 改完规则后看抓取日志,确认蜘蛛的请求量、状态码分布和路径覆盖符合预期,而不是改完就放着。
几个判断口径
- 某个 URL 要从索引中移除:优先 410/404 或 noindex,Disallow 排在后面。
- 某个目录只是不想被频繁抓取:可以用 Disallow 或调低抓取压力,但要接受它仍可能被链接、被发现。
- 想控制抓取节奏:先从日志里找到真实的请求峰值和响应时间,再决定措施,而不是只加一行 Crawl-delay。
robots.txt 是一份给蜘蛛的请求说明,不是贴在站点的封条。把“发现”和“抓取”分开对待,很多看起来矛盾的现象就能对上号。