robots.txt 放在站点根目录,是给爬虫看的建议书。它没有任何强制力,也谈不上访问控制——但它常常决定入口页在第一轮抓取里是放行还是被拦下。这份文件写对了不会带来额外好处,写错了却足以让前面做的工作全部浪费。
入口页的基本姿态:放行
蜘蛛池入口页的职责是承接抓取、把蜘蛛引向目标页,所以默认姿态应该是放行。常见的错误写法是出于安全考虑直接写一整段 Disallow: /,把整站关掉,然后又指望蜘蛛照常来抓入口页。这两件事在逻辑上不可能同时成立。
一个可用的最小结构大致是这样:允许全站抓取,单独屏蔽几个不该出现的目录,再把 sitemap 地址写进去。
- 允许抓取入口页本身,这是最基础的
- 允许抓取入口页引用的 CSS、JS、图片等静态资源
- 用 Sitemap 指令指向入口页或页面清单的地址
- 只对确实无意义的目录做屏蔽,不要成片封杀
哪些东西值得屏蔽
屏蔽规则要克制。入口页的目录结构和普通站点不一样,通常没有用户后台、购物车这类内容,所以真正需要挡住的并不多:
- 后台、管理路径和测试目录
- 会输出大量重复结果的站内搜索地址
- 临时生成、随时会失效的调试页面
- 返回 5xx 或重定向链过长的路径
注意这里的屏蔽是对合规爬虫生效的。对方是否遵守,不在你的控制范围内,因此不要把 robots.txt 当成防抓措施来设计。
几个最容易写错的地方
误伤 CSS 和 JS
很多模板会顺手把 /assets/、*.js、*.css 一起屏蔽掉。对于依赖脚本渲染的入口页,这会让蜘蛛拿到的是一份空壳。移动优先索引下,渲染能力本来就有限,把资源挡住只会让页面更难看懂。除非确定页面是纯静态输出,否则别动静态资源目录。
屏蔽了页面,又想让它不被索引
noindex 必须被蜘蛛读到才生效,而被 robots.txt 屏蔽的页面,蜘蛛压根不会去读里面的 meta 标签。所以“先 Disallow,再加 noindex”是典型的自相矛盾。想让页面退出索引,就放行抓取、只加 noindex;想减少抓取压力,就用 robots.txt。两者选一个。
crawl-delay 的兼容问题
crawl-delay 并不是所有爬虫都支持。写上去通常不会有什么坏处,但也不要指望它真的能控制访问频率。真要控制并发,从服务器侧做限速、限连接数更靠得住。
多域名批量复制的事故
蜘蛛池往往有几十上百个域名,robots.txt 一般是统一复制过去的。一旦模板里残留了一条 Disallow: /,就会在所有域名上同时生效,而且不会报错,只能靠人工发现。建议每次批量下发后,随机抽几个域名实际访问一遍 /robots.txt 看内容。
上线前的自查清单
- 用浏览器直接访问几个域名下的 /robots.txt,确认返回 200 且内容完整
- 确认没有全站 Disallow,也没有误伤静态资源目录
- 确认 Sitemap 地址可访问,返回的是页面清单而不是错误页
- 确认屏蔽规则和 noindex 的使用没有互相冲突
- 批量更新后抽查若干域名,而不是只看模板文件
另外,蜘蛛对 robots.txt 本身的请求频率,也是一个还不错的观察窗口。如果日志里这个文件的请求长期为零,通常说明蜘蛛对这批域名兴趣不大,或者根本没有走到这一步。
小结
robots.txt 是一份放行说明,不是防护措施。入口页的原则很简单:能抓的就放行,明确没用的才屏蔽,别用屏蔽去实现本该由 noindex 完成的事。
它不会让蜘蛛多来几次,但写错一次,可能让一批入口页在很长时间里都处在无人问津的状态。