很多抓取异常不是蜘蛛不来,而是站点自己在 robots.txt 里把入口关掉了。robots.txt 决定的是能不能抓,不决定知不知道,但一旦某个目录被禁止抓取,蜘蛛就无法顺着这个目录里的链接继续发现更深的 URL——发现路径会断在入口这一步。
先分清 robots.txt 的职责边界
它是一份抓取许可声明,不是 URL 发现清单。把地址写进 sitemap 或内链,蜘蛛可能知道它存在;但只要 robots.txt 不允许抓取,它就取不到内容,也不会继续跟进页面里的链接。所以排查 URL 发现异常时,robots.txt 应该放在靠前的位置,而不是等日志翻完再看。
几种典型的自我封禁写法
- 测试残留的全站封禁。上线前写的「禁止所有」忘了删,或者只删了一半,表现是抓取覆盖面突然收窄。
- 把 sitemap 放在被禁目录里。声明了 sitemap 地址,但该路径本身落在禁止范围内,声明形同虚设。
- 通配符误伤列表页。用通配符挡参数,本意是清理重复 URL,却把翻页、正常需要发现的页面一起挡掉。
- 封掉静态资源目录。样式表和脚本被禁止抓取时,依赖脚本渲染的页面在蜘蛛眼里可能是空的,正文里的链接自然也看不到。
- 放行与禁止规则混用后顺序混乱。规则越长,越容易漏掉某条更具体的禁止项。
逐条核对的顺序
- 完整打开 robots.txt,从第一行读到最后一行,不要只看自己记得的那几条。
- 列出所有禁止与放行规则,对照站点目录结构,标出会被命中的路径。
- 抽取 sitemap 里的 URL 做抽样,看有多少落在被禁范围内。
- 检查声明 sitemap 的地址能否访问、是否被自己的规则覆盖。
- 确认样式表、脚本、图片目录没有被误封,尤其是内容靠前端渲染的页面。
- 核对放行目录里是否还有真实存在的内链入口,别让放行目录变成空壳。
日志里看不到的那部分
被 robots.txt 拦下的请求通常到不了服务器,日志里只会安静一片。所以「日志没有异常」并不等于「发现正常」,这两件事要分开看。如果某个目录长期没有任何抓取记录,又找不到 404 或超时的痕迹,先怀疑规则,再怀疑其他原因。
和 noindex 的区别
禁止抓取是不让取内容,noindex 是取到之后不让收录。想下线内容时,两者不能互相替代:只写禁止抓取,蜘蛛进不来,也就看不到 noindex,判断会一直停在原地。
改完规则之后怎么观察
规则调整不必一步到位。可以先放开一层目录,观察一段时间里该目录的抓取请求量、返回状态分布,以及更深层 URL 是否开始出现抓取痕迹。放开的节奏取决于服务器承受能力和内容规模,没必要一次性全开。
robots.txt 只管抓取许可,不管 URL 是否被记录。被禁止抓取的地址仍可能以缺少描述的形式出现在结果里,所以别把它当成内容下线的工具。
把 robots.txt 当作一条需要定期复核的通道规则,而不是一次写完就不动的文件,URL 发现路径上的堵点会少很多。