robots.txt 是站点递给爬虫的第一份说明,它管的是“能不能抓”,不是“能不能收录”。不少抓取异常、页面表现不对、渲染判断出错,回头查都是这个文件里某一行写错造成的。下面按匹配规则、常见误区和修改前后的验证三部分来说。
先弄清楚它怎么匹配
- UA 段的选择:爬虫会挑最贴合自己身份的那一段,而不是一律读 * 段。Googlebot 优先读 Googlebot 段,其他爬虫读通用段,所以给特定爬虫写规则时要单独成段。
- 同一段内多条规则:路径匹配更长的优先,长度相同时 Allow 通常胜出。写规则时尽量让意图不冲突,别指望靠顺序。
- Disallow 是前缀匹配:写 Disallow: /tmp 会连同 /template、/tmp2 一起挡住,不是只挡 /tmp 这个目录。想限定目录,路径末尾补斜杠更稳妥。
- 通配符:* 匹配任意字符,$ 表示结尾,主流搜索引擎支持,但一些老旧或小众爬虫不一定认,别把关键限制全押在通配上。
- 路径区分大小写,空行用来分隔不同的 UA 段,写乱会导致整段失效。
几个容易踩的坑
- 通用段里写了 Disallow: /,本意是挡某个目录,结果全站被挡,日志里抓取量突然归零往往就是这里。
- 想阻止某页面被收录,却用 Disallow 把它挡在门外。页面仍可能因为外链出现在结果里,而蜘蛛读不到页面上的 noindex。正确顺序是:让页面可抓、页面内标 noindex,等状态稳定后再谈屏蔽。
- 把 CSS、JS、图片目录一起挡掉。页面渲染和移动端判断都依赖这些资源,挡了之后蜘蛛看到的可能是一张缺样式的空壳。
- Sitemap 声明用了相对路径,或者根本没有声明。这里写的是绝对地址,也可以写多行。
- 注释习惯写在规则行尾,容易把规则本身注释掉,建议单独一行写。
Sitemap 与抓取速率
在 robots.txt 里声明 Sitemap 是给蜘蛛一个发现入口的提示,跨域声明一般需要先完成站点验证。它只是提示,不代表某个 URL 一定会被抓取,也不代表抓取频次会变化。
Crawl-delay 这块要特别说明:Google 明确不支持这个指令,Bing 部分支持,指望它来控制抓取压力并不可靠。真正影响抓取节奏的是服务器响应速度、站点可抓页面的规模和内容更新频率。如果服务器吃紧,更可控的做法是在服务器层按 UA 做限速,或者在维护期间返回带 Retry-After 的 503,让蜘蛛按你的节奏退让,而不是在 robots 里写一个没人执行的数字。
改之前和改之后怎么验证
- 用搜索引擎提供的 robots 测试工具,把你关心的几类 URL 都跑一遍:首页、列表页、详情页、被屏蔽的资源目录,确认结果和预期一致。
- 翻服务器日志,看被屏蔽的路径在修改后是否还有请求。有残留说明规则没生效,或者对方没读这一段。
- 大范围屏蔽之前先小范围试,改完把时间点和具体内容记录下来,方便出问题时回滚。
- 顺手检查 Sitemap 和内链,里面如果还挂着已经屏蔽的 URL,蜘蛛会顺着爬过去再被挡住,白白消耗抓取次数。
判断一条规则安不安全,方法很简单:把关键 URL 丢进测试工具,看它返回的是“允许”还是“屏蔽”,和自己想的是不是一回事。
最后提醒一点,robots.txt 是一份约定,不是权限控制。遵不遵守取决于对方,真正私密的内容应该靠登录、鉴权或访问控制来解决,而不是写在 Disallow 里。