搜索抓取

被 robots.txt 挡住的 URL,蜘蛛还会从哪里知道它存在

robots.txt 决定的是要不要去抓,而不是这个 URL 会不会被发现。本文拆开讲蜘蛛遇到被禁路径时的分叉方式、Allow 与 Disallow 的匹配边界,以及运营侧该检查的内链、Sitemap 与日志信号,帮助把 URL 发现和抓取权限分开管理。

搜索抓取

被 robots.txt 挡住的 URL,蜘蛛还会从哪里知道它存在

不少站点在 robots.txt 里写上一段 Disallow,就默认那部分内容从搜索里消失了。实际情况要分开看:被禁的路径,蜘蛛通常不会去抓,但它仍然可能通过别的入口知道这些 URL 的存在。抓取和发现是两条线,混在一起判断,很容易做出错误决策。

robots.txt 管的是抓取,不是发现

robots.txt 的规则作用于“是否去取这个 URL 的内容”。它不阻止外链提到这个地址,也不阻止 Sitemap 里写下这个地址,更不阻止别人转载你的页面。只要 URL 被写到了某个蜘蛛能读到的地方,它就可能进入待抓取队列,只是在真正发起请求前被规则拦下。

所以会出现一种情况:日志里某些被禁目录没有抓取记录,但搜索结果里仍然能看到相关地址。这不是规则失效,而是发现和抓取发生在不同环节。

蜘蛛到达被禁路径时会怎么走

一个常见的路径是这样的:蜘蛛从入口页进入,抓取一个允许访问的列表页,在 HTML 中找到若干链接。指向允许路径的链接会继续排队抓取;指向被禁路径的链接,通常会被记录为“已知但不可抓取”,本轮不再请求。

分叉点就在这里。如果列表页本身也被 Disallow,蜘蛛可能根本到不了这个页面,链接自然也不会被读到。反过来,如果列表页允许、详情页被禁,URL 仍然会被发现,只是内容取不到。

  • 允许页指向被禁详情页:URL 被发现,内容不抓取。
  • 被禁列表页指向允许详情页:路径在这一层断开,后面的 URL 基本没有入口。
  • Sitemap 中列出被禁 URL:蜘蛛读到地址,但同样受规则约束。

Allow 与 Disallow 的写法会改变边界

规则匹配不是简单的“包含即命中”,通常按路径长度做最长匹配,Allow 可以覆盖 Disallow。常见坑有几个:

  • 目录前缀误伤:写 Disallow: /shop 时,/shop-guide 这类同前缀路径也可能被一起挡住,需要更精确到 /shop/。
  • 通配符与结尾符:$ 用于精确结尾,* 用于匹配任意字符串,滥用会让规则变得难以预测。
  • 意图没写清:先 Allow 整站再 Disallow 某目录并不会改变顺序,但规则维护时容易互相矛盾。

运营侧可以对照检查的几件事

  • 被禁目录里是否还有需要被抓的正常页面。如果只是屏蔽筛选参数,尽量用参数级规则,而不是整目录封禁。
  • Sitemap 里是否混入被禁 URL。这类地址会让蜘蛛反复读到却取不到,消耗的是它的时间。
  • 内链是否指向被禁路径。导航、面包屑、相关推荐中的这类链接,会让抓取路径在同一处分叉后断掉。
  • 日志里是否出现大量 403。因 robots 被拦通常表现为“未发出请求”,出现成片 403 更可能是 WAF 或权限配置的问题。

把 URL 发现和抓取权限分开管理

更稳妥的做法是:先用内链、Sitemap、提交接口保证重要 URL 被发现,再用 robots.txt 决定哪些允许被抓。两件事分开看,排查时就不会把“没被抓”和“没被发现”混为一谈。

robots.txt 只表达站点的抓取意愿,搜索引擎是否采纳、是否收录,由对方决定。调整规则后,建议用日志观察一段时间再判断效果。