搜索抓取

robots.txt 的抓取边界:哪些路径会被绕开,哪些写法会挡错资源

robots.txt 是搜索蜘蛛抓取前的第一道检查。本文讲清它的匹配优先级、容易被误挡的 CSS 与 JS 目录、Disallow 与 noindex 的区别,以及文件本身返回错误时的后果,最后给出一份上线前后的检查清单。

搜索抓取

robots.txt 的抓取边界:哪些路径会被绕开,哪些写法会挡错资源

蜘蛛抓取一个站点,第一件事往往不是取首页,而是先取根目录下的 robots.txt。这个文件不决定页面能不能排名,但它决定蜘蛛有没有去请求某条 URL 的资格。规则写错一行,可能让整站目录、模板资源或者某个子站从抓取路径上消失,而且改动不会立刻生效。

robots.txt 的读取与缓存

主流搜索引擎在抓取前会读取 robots.txt,并把结果缓存一段时间,通常是几个小时到一天不等。修改文件之后,蜘蛛可能还在用旧规则,尤其是被误屏蔽的目录,恢复抓取往往比屏蔽更慢。所以上线新目录、改版切流这类操作,最好在推动抓取之前就把 robots.txt 调整好。

另外,蜘蛛一般只读取域名根目录下的 robots.txt,子目录里的同名文件不会生效。用子域名部署的站点需要各自维护一份。

基础语法与匹配的优先级

  • User-agent:指定规则适用的爬虫,User-agent: * 表示所有爬虫。存在多个分组时,蜘蛛会选择与自己名称最匹配的那一组。
  • Disallow:禁止抓取的路径前缀,Disallow: / 等于整站禁抓,写成 Disallow 但路径留空则等于不限制。
  • Allow:在被禁止的目录里开一个口子,比如先禁掉整个目录,再用 Allow 放开其中一部分。
  • 通配符:星号匹配任意字符,美元符号匹配结束位置,可以用来精确限定带参数的 URL。
  • Sitemap:可以在这里声明站点地图地址,但它是独立指令,和 Allow、Disallow 不属于同一类规则。

匹配时通常遵循“最长路径优先”,路径更长、更具体的规则胜出;路径长度相同时,Allow 一般优先于 Disallow。不同爬虫的实现细节略有差别,规则越简单越不容易踩坑。

最容易被挡错的三类资源

第一类是 CSS 和 JS 目录。把静态资源目录整体禁抓,看起来是让蜘蛛少抓点文件,实际会让渲染出的页面缺样式、缺内容,蜘蛛看到的可能是一个不完整的版本。第二类是图片和附件目录,被挡住之后图片搜索的入口也就断了。第三类是分页或筛选参数,本想节省抓取额度,结果把正常的内容列表也一并挡掉。

更稳妥的做法是先用日志确认哪些目录真的在被大量重复抓取,再针对具体路径下手,而不是一上来就禁掉整个目录。

Disallow 不等于 noindex

这是最常见的误解。被 robots.txt 挡住的 URL,蜘蛛拿不到内容,也就读不到页面里的 noindex 标记。结果可能出现:这条 URL 因为外部链接或其他信号仍然出现在搜索结果里,只是没有摘要和快照。

如果目标是让页面彻底退出索引,就不要用 robots.txt 挡它,而是让蜘蛛抓到页面并读到 noindex。反过来,一条已经被禁抓的 URL,再加 noindex 是无效组合。两个工具管的是不同阶段:robots.txt 管“能不能抓”,noindex 管“抓到之后要不要留”。

robots.txt 自身出问题会怎样

如果 robots.txt 返回 404,蜘蛛一般视为没有限制,继续正常抓取;如果返回 5xx 或者连接超时,多数搜索引擎会保守处理,暂停或降低抓取,避免误闯不该抓的地方。所以不要把 robots.txt 做成依赖数据库或动态脚本输出的文件,静态返回最稳。也不要让它参与重定向链,更不要指望用 JS 渲染出来。

Crawl-delay 和限速

Crawl-delay 是部分爬虫接受的约定,主流搜索引擎并不遵循它。真正想控制抓取压力,通常是通过服务器响应速度、日志观察和搜索引擎提供的抓取速率设置来调整。与其在 robots.txt 里写一个没人遵守的数字,不如把首页和列表页的响应时间控制好。

上线前后的检查清单

  1. 确认根目录 robots.txt 返回 200,内容是纯文本。
  2. 检查是否误挡了 CSS、JS、图片目录。
  3. 需要屏蔽的路径是否用了最短、最明确的前缀写法。
  4. 打算移除索引的页面,不要放进 Disallow。
  5. 站点地图里提交的 URL 不要和 Disallow 规则互相冲突。
  6. 改动之后隔一段时间再看日志,确认蜘蛛是否按新规则访问。
robots.txt 是给守规矩的爬虫看的约定,不是权限系统。真正需要保护的内容,应该放在登录之后,而不是指望一个文本文件挡住。