搜索抓取

robots.txt 的匹配顺序与通配符:蜘蛛怎样判断一个 URL 能不能抓

robots.txt 不是简单的开关,蜘蛛读它时做的是一次路径匹配。本文讲清 User-agent 分组、前缀匹配与最长匹配优先的顺序,说明 * 和 $ 的正确用法,并列出整站误封、把 Disallow 当收录开关等常见事故,最后给出上线后的测试与日志验证方法。

搜索抓取

robots.txt 的匹配顺序与通配符:蜘蛛怎样判断一个 URL 能不能抓

很多人把 robots.txt 当成一个“禁止抓取”的总开关,但蜘蛛真正读它的时候,做的是一次规则匹配:把当前 URL 拿去和文件里的每一条 Allow / Disallow 比对,看哪条更具体。理解这个匹配过程,比背几条语法更有用。

规则是按分组和顺序生效的

robots.txt 由若干分组构成,每个分组以 User-agent 开头,后面跟若干 Allow / Disallow。蜘蛛只会挑和自己匹配的那个分组来读,不会把不同分组的规则混在一起。

  • User-agent: * 是所有爬虫的兜底分组;写了具体爬虫名的分组会整体覆盖 * 分组的规则,而不是在其基础上叠加。
  • 同一个分组里,匹配长度更长的那条规则优先。比如 Disallow: / 与 Allow: /public/ 同时存在时,/public/a.html 会走 Allow。
  • 路径是前缀匹配:Disallow: /tmp 既挡住 /tmp 和 /tmp/1.html,也会挡住 /tmpabc。如果只想挡目录,写成 /tmp/ 更准确。
不同爬虫对通配符和最长匹配的遵循程度并不完全一致。规则写得越简单直白,跨爬虫的偏差越小。

通配符不是正则

robots.txt 只认两个特殊符号:* 表示任意字符序列,$ 表示 URL 结尾。它不支持字符组、量词和分组捕获。

  • Disallow: /*.pdf$ 只会挡住以 .pdf 结尾的地址。
  • Disallow: /*?sort= 会挡掉任何带 sort 参数的路径,正文页很容易被顺手误伤,写之前先看日志确认参数分布。
  • 路径大小写敏感:/Images/ 和 /images/ 是两条不同路径,写规则前先确认服务器是否区分大小写。

几类最容易出事的写法

  1. 整站误封:Disallow: / 写在了不该写的分组或行里,结果全站不可抓。上线前一定要拿几个真实 URL 跑一遍验证。
  2. 把 robots.txt 当收录开关:想控制收录要用 meta robots 的 noindex,而不是 Disallow。被 Disallow 的页面蜘蛛读不到内容,自然也读不到 noindex,URL 仍可能以缺少描述的形式出现在结果里。
  3. 测试站沿用线上文件:预发布域名带着 Disallow: /,切流量上线后蜘蛛被挡在门外,日志里还看不出明显异常。
  4. 规则与 Sitemap 自相矛盾:robots.txt 里声明了 sitemap 地址,却把 sitemap 所在目录 Disallow 掉。

改完怎么确认

不要只看文件内容,要看实际效果:用搜索平台提供的 robots.txt 测试工具,输入几个典型 URL 检查判定结果;再对照服务器日志,看这些 URL 的请求量是否真的减少或增加。改动后的一到两周内,重点观察日志中抓取频次与状态码变化,确认没有误伤正常页面。

另外,Crawl-delay 这类指令并非所有蜘蛛都支持,别把它当成限流的主要手段。服务器压力问题,优先从缓存、响应时间和并发连接数上解决,robots.txt 只负责表达抓取许可,不负责调节性能。