搜索抓取

robots.txt 与抓取路径:一条 Disallow 会挡掉多少 URL 发现

robots.txt 不只决定单个页面能否被抓,它还会改变蜘蛛沿内链发现 URL 的路径。本文拆解 Disallow 的常见写法、通配符与状态码问题,说明目录级封禁如何截断抓取链路,并给出一份可执行的自查清单,帮助减少误拦截带来的 URL 发现损耗。

搜索抓取

robots.txt 与抓取路径:一条 Disallow 会挡掉多少 URL 发现

对多数蜘蛛来说,抓取一个站点的第一步往往不是首页,而是根目录下的 robots.txt。它决定接下来哪些路径允许被访问。这个文件写得太随意,影响的不只是某个页面是否被抓,而是整条 URL 发现链路还能不能走通。

Disallow 拦的是抓取,不是索引

一个常见误解是:把页面 Disallow 掉,就等于不让它出现在搜索结果里。实际情况是,蜘蛛无法抓取这个 URL,但如果站外或站内别处仍有链接指向它,它依然可能以“无摘要”的形式出现在结果中。想阻止索引,应该用 noindex,而前提是该页面必须允许被抓取——否则蜘蛛读不到 noindex 这条指令。

想让页面不被索引,先得让它被抓到;不想让它被抓,就别指望 noindex 生效。

目录级封禁如何改变 URL 发现

写下 Disallow: /tag/ 这类规则后,蜘蛛不只是不进标签页,也不会再从标签页里顺着链接发现文章。列表页、筛选页、分页同理。抓取路径是串联的:中间一段被封,后面的 URL 就少了一条被发现的路。

  • 被封禁目录里的内链无法继续传递发现价值,等于把这一块从抓取图里摘掉。
  • Sitemap 里提交的 URL 如果同时被 Disallow,通常也无法作为有效入口,清单作用大打折扣。
  • 规则按最长匹配生效,写得过宽时,可能连 CSS、JS、图片一起挡掉,渲染型页面就更容易读不完整。

通配符和结尾符,容易写宽也容易写窄

* 与 $ 的用法直接决定拦截范围。Disallow: /*?sort= 会把任何带 sort 参数的 URL 一并挡掉,包括你本来希望被发现的列表页;而 Disallow: /search 挡不住 /search/。写规则时,最好拿真实 URL 逐条对照,而不是凭印象判断。

Crawl-delay 与抓取节奏

部分蜘蛛会读取 Crawl-delay,但主流搜索蜘蛛并不完全依赖它,更多依据自身对服务器响应速度和站点质量的判断来调整频率。与其在这里设一个很大的值,不如先解决响应慢、连接不稳的问题。

robots.txt 本身返回什么状态码

这个文件自己也是被请求的 URL,它的返回状态同样会影响行为:

  • 200 且内容正常:按规则执行。
  • 404:多数蜘蛛会视为没有限制,按可抓取处理。
  • 5xx 或超时:部分蜘蛛会暂时降低或停止抓取,等文件恢复后再继续。
  • 被重定向到其他域名或登录页:行为不确定,相当于把规则的解释权交了出去。

与 Sitemap、内链的配合

Sitemap 是候选清单,不能替代抓取路径。如果清单里的 URL 恰好落在 Disallow 范围内,这份清单基本失效。内链则是发现新 URL 的主干通路,被封锁的目录意味着那些等着蜘蛛顺链接走来的页面,可能很久都等不到一次访问。两者要一起看:允许被抓的目录,才值得放进 Sitemap;放进 Sitemap 的目录,也不该被规则挡住。

一份可以照着做的自查

  1. 打开 robots.txt,把每条规则拿到真实 URL 上逐条验证。
  2. 检查是否有目录级封禁,挡住了列表页、标签页、分页这类聚合入口。
  3. 确认 CSS、JS、图片等渲染资源没有被误挡。
  4. 确认 robots.txt 返回 200,且没有跳转到别的地址。
  5. 对照 Sitemap,看提交的 URL 是否与 Disallow 冲突。
  6. 改动后观察抓取日志中对应目录的访问变化,作为验证依据,而不是当作效果承诺。

小结

robots.txt 是一道门,不是一块牌子。它不只在回答“能不能抓”,也在悄悄决定蜘蛛还能顺着哪条路走、能发现多少新 URL。规则越简洁、越贴近真实目录结构,抓取路径就越不容易在中途被截断。