robots.txt 是站点与蜘蛛之间最早生效的一份约定。它放在域名根目录下,用来告诉蜘蛛哪些路径可以抓、哪些先别抓,以及 Sitemap 放在哪里。它不负责收录,也不等于“屏蔽搜索引擎”。把它当成抓取范围与抓取节奏的调节阀,才用得稳。
它管的是抓取,不是收录
被 Disallow 拦住的 URL,原则上不会被蜘蛛请求,因此也就没有机会被抓取和后续处理。但反过来,放开抓取也不代表一定被收录——收录还要看内容质量、重复度、页面是否可访问。常见误区是:为了“让页面收录”去删掉 Disallow,结果反而放进来一批低质或重复地址,把抓取量消耗掉。
Allow 与 Disallow 的匹配规则
主流蜘蛛基本按路径前缀匹配,顺手把几个容易踩的细节列一下:
- 写 Disallow: /tmp/,会同时拦住 /tmp/ 与 /tmp/a/b.html,但未必拦住 /tmpfile,因为前缀到斜杠为止。
- 通配符 * 和结尾符 $ 在主流蜘蛛上普遍支持,但小众采集器可能直接忽略,别把它们当作唯一防线。
- 路径区分大小写。写成 /Search/ 而实际目录是 /search/,等于没拦。
- 写成 Disallow: / 会拦住整站,包括首页。这一条只适合临时全站维护。
- Allow 的优先级通常高于 Disallow,可以先用 Disallow 收窄大目录,再用 Allow 放行其中某个子目录。
抓取频控:Crawl-delay 只是建议
很多人想用 Crawl-delay 直接把蜘蛛访问频率压下来。需要注意两点:其一,它并非所有蜘蛛都认,部分主流蜘蛛早已不读取这一行;其二,即便读取,也只是建议值,站点响应慢或抓取需求高时仍可能被突破。
真正影响抓取节奏的,更多是服务器响应速度、错误率和你自己的内容更新频率。如果某些接口压力大,用 robots.txt 拦住对应路径,比调 Crawl-delay 更直接有效。
把 Sitemap 写进 robots.txt
在文件里加一行 Sitemap 声明是成本很低的做法,能让蜘蛛在同一个位置拿到清单入口。写法上注意几点:
- 用完整绝对地址,包含协议与域名。
- 地址必须与当前 robots.txt 所在域名一致,跨域名声明通常不会被采用。
- 可以写多条,用于分片或多个子域的 Sitemap。
- Sitemap 里只放可抓取的规范地址,别把已经 Disallow 的 URL 又写进去,逻辑上自相矛盾。
常见的误封清单
下面这些场景,日志里经常表现为抓取量突然腰斩:
- 模板上线时顺手复制了测试环境的 robots.txt,把生产目录拦了。
- 为了挡住搜索结果页或筛选参数,顺手把整个列表目录拦掉,导致详情页失去发现入口。
- 拦住 CSS、JS 所在目录,页面能抓但渲染受限。
- 把 /uploads/ 之类静态资源目录整体拦掉,图片与附件不再被抓取。
- robots.txt 本身返回 404 或 500,不同蜘蛛的处理策略不一致,结果难以预期。
改动之后怎么验证
改完不要只看文件内容,回头看日志更实在:
- 确认 robots.txt 返回 200,且内容是你刚改的版本,注意 CDN 或缓存层是否还留着旧文件。
- 观察改动后一到两周内,被拦路径的请求量是否下降到接近零。
- 观察放行路径的请求量是否上升,有没有出现大批无意义的参数地址。
- 核对 Sitemap 中的 URL 是否都在允许范围内,抓取比例是否正常。
小提示:robots.txt 生效有延迟,蜘蛛不会立刻按新规则执行。改动后给出足够观察窗口,再判断是否达到了预期,避免频繁来回修改。
和其它控抓手段的分工
robots.txt 只是入口层的一环。具体到单页层面,可以用 meta robots 或响应头 X-Robots-Tag 控制索引与跟随;已经下线的页面交给 301、404、410 去表达状态;临时限流交给 429、503 加 Retry-After。几层各管一段,配合使用比指望一个文件解决全部问题更靠谱。