搜索抓取

robots.txt 里的抓取边界:Disallow 规则与 Sitemap 声明的核对

robots.txt 决定蜘蛛能进入哪些路径,也常被用来声明 Sitemap。规则写得太宽会挡住需要被抓的 URL,写得太松又可能放开测试目录。本文梳理路径匹配的常见细节、Sitemap 声明的位置限制,以及用响应、日志和测试工具核对抓取边界的具体做法,减少入口被误挡的情况。

搜索抓取

robots.txt 里的抓取边界:Disallow 规则与 Sitemap 声明的核对

抓取边界先于抓取效率

robots.txt 放在域名根目录,是蜘蛛在抓取前通常会读取的文件。它的作用是告诉蜘蛛哪些路径可以抓、哪些不要抓,并不直接控制 URL 是否出现在搜索结果里。被 Disallow 的 URL 仍可能因为外链、历史记录等原因出现在结果中,只是页面内容难以被抓取和理解。理解这一点,才不会把 robots.txt 当成去索引工具,也不会因为写了一条规则就认为问题已经解决。

路径匹配的几个细节

  • Disallow: / 表示整站禁止抓取,包括首页,通常只适合还在搭建、不希望被访问的站点。
  • 规则按路径前缀匹配,不是按目录匹配。Disallow: /news 会同时挡住 /newsletter、/news-detail 这类以 /news 开头的地址。
  • 通配符 * 和结尾符号 $ 的支持度因蜘蛛而异,写得太复杂时,建议用测试工具验证实际匹配结果。
  • Allow 用来在禁止目录里开例外,一般按最长匹配路径优先,但把 Allow 写在 Disallow 之后、路径又更短,例外就可能失效。
  • 路径区分大小写,规则里的大小写与站点实际 URL 不一致时,等于没有生效。
  • robots.txt 自身应返回 200、内容类型为 text/plain;如果返回 5xx,部分蜘蛛会暂时减少抓取,返回 403 与返回 404 的处理也不完全相同。

Sitemap 声明的位置与限制

在 robots.txt 中写一行 Sitemap: 地址,是常见的 Sitemap 声明方式。需要注意几点:Sitemap 行不受同文件里 Disallow 规则影响,声明的是地址,不代表其中的 URL 一定会被抓;跨域 Sitemap 通常需要在搜索平台侧验证;如果 Sitemap 中大量 URL 同时被 Disallow,提交行为与抓取行为就互相矛盾。更稳妥的做法是,robots.txt 里声明 Sitemap,同时在搜索平台的提交入口单独提交一份,两边保持一致。

抓取延迟与服务器承载

Crawl-delay 的支持度并不统一,实际抓取节奏更多取决于服务器响应时间、错误率以及入口数量。响应慢、5xx 多,蜘蛛自然会降低抓取频率,URL 发现也会跟着变慢。与其在 robots.txt 里设置抓取延迟,不如先看服务器响应时间和错误日志。确实需要限速时,可以考虑在 CDN 或 WAF 层对特定 UA 做限速,但不要把搜索蜘蛛整体拦截,否则入口会直接从抓取队列中消失。

核对清单

  1. 用浏览器直接访问 /robots.txt,确认状态码、内容类型和内容本身正常,没有被 CDN 或 WAF 替换成验证页。
  2. 用 curl 指定蜘蛛 UA 请求被允许与被禁止的 URL,比较返回内容。要记住规则只约束蜘蛛,不改变服务器响应,所以返回 200 不等于允许抓取。
  3. 在搜索平台的测试工具里输入具体 URL,确认它是被允许还是被挡,重点检查分页、排序参数页、接口路径。
  4. 在服务器日志中按蜘蛛 UA 筛选,统计各目录的抓取次数,观察被 Disallow 的目录是否仍有请求,判断是规则没生效还是其他爬虫在访问。
  5. 检查是否存在 Disallow 与 noindex 叠加使用的情况。两者同时出现时,noindex 可能永远没机会被看到。
  6. 改版或迁移时,先更新 robots.txt,再更新内链与 Sitemap,观察一到两周日志后再收紧规则。

容易踩的坑

  • 用 robots.txt 屏蔽测试站,上线后忘记移除,导致正式内容长期不被抓取。
  • 为了屏蔽排序参数页,把分页序列一起挡住,深页 URL 的发现入口随之减少。
  • 把 Sitemap 放在被 Disallow 的目录下,又希望它稳定被抓取。
  • 把 robots.txt 当作去索引手段,结果 URL 仍出现在结果中,只是没有可读摘要。
robots.txt 是抓取入口的第一道门。改动前保留旧规则,改动后在日志里核对一周以上。它只影响抓取行为,不能决定 URL 是否被收录,也不适合用来掩盖内容质量或服务器稳定性问题。