搜索抓取

robots.txt 不只是开关:几行规则怎样改变蜘蛛的抓取路径

robots.txt 常被当成抓取的总开关,实际它影响的是蜘蛛的路径与预算分配。本文梳理规则缓存带来的延迟、Disallow 与 noindex 的区别、通配符与结尾符的常见写法问题、Sitemap 声明的注意事项,以及内链被挡、站点承压时的处理顺序。

搜索抓取

robots.txt 不只是开关:几行规则怎样改变蜘蛛的抓取路径

很多站点把 robots.txt 当成一个允许或禁止抓取的总开关,写完就不再维护。实际运行中,它更像一份写给蜘蛛的路线说明:哪些目录可以走,哪些路径不必来,Sitemap 放在哪里。规则写得不严谨时,出问题的往往不是全站被屏蔽这种显眼故障,而是链接路径被截断、抓取预算消耗在无用地址上。

蜘蛛什么时候读它,读到的是哪一版

蜘蛛通常在抓取某个 URL 之前读取该主机下的 /robots.txt,并且会缓存这份文件。缓存时间没有统一承诺,可能几小时,也可能更久。这意味着两件事:一是刚改完规则不要指望立刻生效;二是如果中途关闭了全站抓取,恢复时可能要等缓存过期。

另一个常被忽略的点是子域与协议。不同子域各自有独立的 robots.txt,http 与 https 在多数实现里也被视为不同主机。站点迁移协议后,如果只在旧地址更新规则,新地址上可能仍是一份过期的文件。

Disallow 挡住的是抓取,不是收录

被 Disallow 的 URL 并不会自动从索引中消失。如果其他页面还在大量链接它,蜘蛛无法抓取内容来判断,只能依据外链锚文本等信息处理,结果可能是页面仍在索引里,但摘要来自别处。想要真正让页面退出,更稳妥的做法是先允许抓取、让页面返回 404 或 410,或者用 noindex,确认状态变化后再考虑屏蔽。

把 noindex 和 Disallow 同时用在一个 URL 上,是一个常见的互相抵消组合:规则挡住了抓取,蜘蛛也就读不到 noindex。

通配符、结尾符与规则重叠

主流蜘蛛对 * 和 $ 的支持基本一致,但细节仍有差别。几条实用经验:

  • 用 $ 明确结尾,避免 /search 把 /search-help 一起挡住;
  • 通配符不要连用太多层,规则越长越难维护,也越容易误伤;
  • 同一路径下,更具体的规则通常优先,但不要依赖直觉顺序,写规则时就让每条互不重叠;
  • 不要指望用 Disallow 挡参数页,参数组合无穷,规则往往挡不全,反而留下半开的口子。

Sitemap 声明放在这里,不等于被读取

在 robots.txt 里写 Sitemap 地址是方便的做法,但它只是告诉对方文件的位置。文件本身能否被顺利抓取,取决于文件大小、层级数量、返回状态码以及是否被规则误挡。如果 Sitemap 所在目录被 Disallow,等于声明了一个不让进的入口。定期用抓取工具或服务器日志确认 Sitemap 文件的访问状态,比只看 robots.txt 的内容更有意义。

内链被挡住,路径就断了

当关键栏目页、分页或标签页被规则挡住时,蜘蛛走到这里就停下,后面的链接也就无从发现。这类问题在日志里表现为:入口页有大量访问,深层页面几乎没有蜘蛛记录,而你在页面上明明做了内链。排查时可以先看被挡路径下面的 URL,是否还有别的方式能到达。Sitemap 可以作为补充,但内链才是日常抓取的主要路径。

用 robots 做节流,效果有限

Crawl-delay 只有部分蜘蛛支持,而且粒度很粗。真正影响抓取节奏的,更多是服务器响应时间、页面返回状态和内容更新频率。如果站点压力大,优先做的是缓存、压缩和稳定的响应,而不是在 robots.txt 里加一行延迟——规则不被遵守时,压力依旧存在。

一条可用的排查顺序

  1. 访问 /robots.txt,确认返回 200,内容与预期一致;
  2. 检查各子域、http 与 https 是否都有对应规则;
  3. 拿具体 URL 对照规则,确认是否存在误挡;
  4. 查看 Sitemap 文件本身能否被抓取,状态码是否正常;
  5. 结合服务器日志,看蜘蛛在被挡路径下是否完全没有请求。

robots.txt 本身不复杂,复杂的是它与 Sitemap、内链、状态码之间的配合。把它当成一份需要定期复核的配置,而不是一次性写死的开关,抓取路径会顺很多。