蜘蛛在抓取站内任何一个具体 URL 之前,通常会先请求一次 robots.txt。很多人只把它当成一张禁止进入的告示,写两条 Disallow 就收工。实际上它同时扮演几个角色:声明 Sitemap 位置、划定可以抓取的范围、在某些搜索引擎上提示抓取节奏。规则写得准,能省下不少抓取资源;写得偏,可能让整站内容从蜘蛛视野里消失。
位置固定,读取顺序靠前
robots.txt 只能放在域名根目录,路径固定为 https://example.com/robots.txt。放在子目录里没有意义,蜘蛛不会去那里找。
不同返回状态对应不同处理:返回 404,通常按“允许抓取全部”处理;返回 5xx,说明服务器端有问题,蜘蛛可能暂时降低抓取频率;返回 200 但内容为空,等同于不做任何限制。所以这个文件本身也是一个需要保持可访问的地址。
用 Sitemap 声明把 URL 清单递过去
除了 Disallow,robots.txt 里最实用的一行是 Sitemap 声明。蜘蛛读到这里,就多了一条发现 URL 的路径,不必全靠内链一层层爬。
User-agent: *
Disallow: /search
Allow: /search/about
Sitemap: https://example.com/sitemap.xml
- 每行一个完整地址,必须带协议和域名,相对路径无效
- 有多个 Sitemap 就写多行,也可以声明 Sitemap 索引文件
- 声明只是一条线索,不代表会被抓取,更不代表会被收录
Allow 与 Disallow 的匹配细节
路径按前缀匹配,/news 会同时命中 /news、/news/2024、/newsletter。想精确一些,可以用通配符 * 和结尾符 $。当 Allow 和 Disallow 同时命中一条路径时,通常长度更长、更具体的那条生效。
另外:路径区分大小写;只写路径不写域名;多个 User-agent 段落要分开,别把规则写成一大段无主语句。
Crawl-delay 的作用比想象中有限
Crawl-delay 以秒为单位,看起来很适合用来保护服务器,但主流搜索引擎对它的支持并不一致,Google 明确不遵循这个字段。真正控制抓取压力的手段,是服务器侧的限速、缓存策略、CDN 回源控制,以及在日志里观察抓取峰值。
把 Crawl-delay 写成一个大数字,往往只是让愿意配合的蜘蛛放慢脚步,新内容被发现的时间跟着变长,而真正造成压力的请求未必减少。
几个容易踩的坑
- 以为 Disallow 等于“不被收录”。如果外部有链接指向该地址,它仍可能出现在结果里。想去掉索引要用 noindex,但 noindex 需要蜘蛛能抓到页面,两者会冲突,需要按路径分开处理。
- 顺手屏蔽 JS、CSS、图片目录。蜘蛛渲染页面时拿不到样式和脚本,可能误判页面质量,也可能看不到脚本生成的链接。
- 规则里带问号、通配符、大小写不统一,实际屏蔽范围超出预期,把正文目录一起挡在门外。
- 长期不维护,Sitemap 里堆着一批已经失效的地址。
改动前后可以对照的清单
- 根目录文件可访问,返回 200,不是 301 到别处
- 不屏蔽 JS、CSS、图片、字体等渲染依赖
- Sitemap 使用绝对地址,内容定期同步
- 上级目录被屏蔽时,重要子目录用 Allow 显式放行
- 改完之后对比服务器日志,看蜘蛛的访问路径和频次有没有变化
robots.txt 是一份长期生效的约定文件,改动的影响会持续一段时间。动手之前先备份一份,改完隔几天再看日志,比凭感觉调规则稳妥得多。