robots.txt 是站长手里最直接的一个开关,改起来只需要一个文本文件。但很多人改完之后会困惑:明明已经 Disallow 了,日志里那条路径还在被抓;或者反过来,原本抓得好好的目录,忽然安静了。这中间隔着的,是蜘蛛读取规则的节奏和它对你这份文件的解读方式。
蜘蛛不是每次抓取前都重新下载 robots.txt
绝大多数爬虫在抓取前会先取一次 robots.txt,但为了省流量,它们会把这份文件缓存一段时间。缓存没过期,蜘蛛就继续按旧规则走。所以你改完文件后的几小时内,日志里仍出现旧行为,属于正常现象,不代表改动失败。
比较实际的做法是:改完之后记住时间点,然后回到服务器日志中,专门看 /robots.txt 这个请求的时间戳。当日志里出现了改动之后的又一次请求,通常意味着新版本已经进入它的缓存。
不同蜘蛛的节奏并不一致
- 大型搜索引擎的爬虫缓存时间相对长一些,规则切换偏慢但稳定。
- 部分二线爬虫、聚合类爬虫可能每次都重新读取,改动几乎是即时的。
- 还有一些小爬虫基本不看 robots.txt,规则改不改对它没有影响。
因此,用一次观测去推断所有蜘蛛的行为,容易得出错误结论。分爬虫、分时间段看日志,才看得出差异。
先确认 robots.txt 本身能被正常取到
规则能不能生效,前提是文件能被取到并且被正确解读。几个基础检查点:
- 路径必须是根目录下的 /robots.txt,子目录里的同名文件不起作用。
- 返回值应为 200,内容为纯文本,不要返回 HTML 页面。
- 用 301 或 302 跳到别的域名或路径时,各家爬虫处理方式不同,有的会跟随,有的直接当作异常,稳定性差,建议直接返回 200。
- 返回 4xx(除 429 这类限流码)时,多数爬虫会视为「没有限制」,也就是放行全部抓取。
- 返回 5xx 时,Googlebot 的处理偏保守,会暂停抓取该站,而不是当成允许。
改动前后都在日志里留下 robots.txt 的请求记录,比凭感觉猜测可靠得多。
几个容易写错、写错又不易察觉的地方
- Disallow 只负责阻止抓取,不等于让已收录的页面消失。想让页面退出索引,需要页面本身返回 noindex,或走相应的移除流程。
- 路径区分大小写,/News 和 /news 是两个不同的位置,写漏一个等于没挡。
- 通配符 * 与结尾符 $ 的支持程度各家不同,用来做精细控制的规则,最好用测试工具逐个验证。
- Sitemap 是独立指令,不要塞进某个 User-agent 组里去理解,它的位置和分组无关。
- 规则是从上往下匹配的,但同一组内多条 Allow 与 Disallow 的优先级,不同爬虫的实现会有细微差别,规则越简单越不容易出问题。
让改动被更快感知的几个做法
- 改动前,把想挡和想放的 URL 各挑几个,用测试工具确认匹配结果符合预期。
- 一次只改一处,改完留出观察窗口,日志里的变化才容易归因。
- 保留旧版本文件,发现误伤时能立刻回滚。
- 改完关注 robots.txt 的请求时间戳,确认新版本已经被读取,再判断效果。
- 如果目的只是控制抓取频率,优先考虑抓取频次设置或服务器端限流,而不是整条路径封掉。
把它当成门槛,而不是实时开关
robots.txt 更像一道门槛:它决定了蜘蛛能走到哪里,但从你修改它,到蜘蛛按新规则走路,中间有一段缓冲。给这段时间留出余量,用日志确认规则已被读取,比反复修改文件更有效。真正需要即时控制的场景,比如临时流量压力,还是交给服务器侧的手段更稳妥。