站点出现“部分 URL 长期不来抓”时,很多人的第一反应是内链或 Sitemap 出了问题,却容易跳过抓取控制文件本身。robots.txt 是搜索引擎进入站点前读取的第一个文件,规则写得含糊或写偏,结果往往不是报错,而是安静地少抓一批页面。
一、先确认文件本身能否被正常读取
robots.txt 只对位于协议加主机根目录下的那一个文件生效,放在子目录里不会被识别。同时,解析器对返回状态码的理解并不相同,需要区分对待。
- 返回 200 且 Content-Type 为纯文本最为稳妥;如果返回的是 200 的 HTML 页面,部分解析器会判定规则无效,行为接近允许全部。
- 返回 5xx 与返回 404 的含义相反:前者可能让抓取在一段时间内被暂停,后者通常被视为没有任何限制。
- 文件开头的 BOM、全角字符、行尾多余空格或中文注释,都可能让首行解析失败,进而影响整个分组的规则。
二、分组与继承:规则到底套在谁身上
robots.txt 按 User-agent 分组,爬虫会优先选择与自己名字最匹配的组,只有找不到更具体的匹配时,才使用星号组。多行 User-agent 写在一起,表示这些爬虫共享后续规则。
常见误配
- 把同一意图的规则拆散到多个星号组,解析时只会采用其中一部分。
- 只为网页搜索爬虫写了分组,却忽略了图片、视频等资源爬虫的分组,导致资源仍被拦。
- User-agent 值本身不区分大小写,但写成带后缀的名字会被视为另一个组,规则不会按预期生效。
三、通配符与匹配长度
星号匹配任意字符串,美元符号表示路径结尾。规则匹配时按路径长度最长优先,长度相同时允许指令优先,且路径比较区分大小写。这几条组合起来,很容易出现超出预期的屏蔽范围。
- 写 Disallow: /*? 会屏蔽所有带参数的 URL,筛选页、分页参数页会整体失去入口。
- 写 Disallow: /search 会连带影响 /search-help 这类同前缀目录,而不只是搜索页。
- 写 Disallow: /*.pdf$ 只屏蔽以 pdf 结尾的地址,带参数的同类文件仍可能被抓取。
写下通配符之前,先想清楚它覆盖的是“一类 URL”还是“一个前缀”。这两者的差集,通常就是缺口出现的位置。
四、别把渲染资源一起挡掉
CSS、JS 和图片被 robots.txt 屏蔽后,页面本身仍可能被读取,但渲染结果会不完整。对于依赖前端渲染的页面,二次抓取时能看到的链接集合会明显变少,URL 发现能力随之下降。检查是否误屏蔽了 assets、static、js 这类资源目录。
五、一套可复用的排查顺序
- 直接请求根目录的 robots.txt,确认状态码、Content-Type,以及是否被重定向到登录页或错误页。
- 按目标爬虫逐条读分组,确认它是否落入了星号组的兜底规则。
- 从抓取日志里挑出返回 200 但很少被访问的 URL,用当前规则做一次人工匹配。
- 检查通配符与结尾符的覆盖范围,确认没有误伤参数页或资源目录。
- 确认文件内的 Sitemap 声明完整,且指向的地址可以直接访问。
- 修改后保留变更记录,用抓取日志观察回访变化,同时排除缓存与 CDN 带来的干扰。
需要提醒的是,robots.txt 只是抓取建议,并不能保证收录,也无法替代 noindex 和页面本身的质量。它更合适的用途是收敛抓取范围,把有限的抓取预算留给真正需要被发现的 URL。