常见问题

蜘蛛池入口页被 robots.txt 挡住:Disallow 误伤、crawl-delay 与抓取超时的排查

入口页做了不少准备,蜘蛛却始终没来,常见原因出在 robots.txt 这一层。本文梳理 Disallow 通配误伤、Allow 优先级、crawl-delay 拖慢节奏、robots.txt 自身返回 5xx 或超时等几种情况,并给出按蜘蛛视角逐步核对的排查顺序。

常见问题

蜘蛛池入口页被 robots.txt 挡住:Disallow 误伤、crawl-delay 与抓取超时的排查

入口页的链接排布、响应速度、链接深度都调好了,日志里却始终看不到搜索蜘蛛的请求 —— 这类情况下,问题往往不在页面本身,而在抓取前的那一步:robots.txt。

robots.txt 是抓取前的第一道闸门

搜索蜘蛛准备抓取某个 URL 之前,通常会先请求该主机下的 robots.txt。如果规则不允许抓取这个路径,页面返回什么内容、放了多少链接,都不再重要,蜘蛛不会进入这一步。

robots.txt 管的是“能不能抓”,页面上的 noindex 管的是“能不能收录”。前者一旦挡死,后者根本没有生效的机会。

几种常见的误配

宽泛的 Disallow 误伤入口页

  • Disallow: /:整站被挡,入口页和目录页都进不来。有时是上线初期为了屏蔽测试环境,后来忘了删。
  • Disallow: /pool/:如果入口页实际部署在 /pool/entry/ 这类子路径下,会被一并挡掉。
  • 用目录名做前缀拦截:例如想挡住后台的 /admin,写成 Disallow: /a,会连带影响所有以 /a 开头的路径。

通配符与结尾符写错

* 在 robots.txt 中匹配任意字符,$ 表示路径结尾。写成 /entry* 会同时匹配 /entry2、/entry-old、/entrytest;写成 /entry$ 则只匹配正好以 /entry 结束的地址。规则写得越具体,误伤的半径越小。

忽略 Allow 与 Disallow 的优先级

多数实现里,当 Allow 与 Disallow 的规则长度相同时,Allow 优先。但如果先写了一条很宽的 Disallow,再想放行某个子目录,就需要显式写一条足够具体的 Allow,否则放行常常不生效。

crawl-delay 设得过大

这个字段并非所有搜索引擎都支持,但支持它的爬虫会按延迟放慢抓取节奏。入口页本身承担 URL 发现的职责,节奏被压得很低时,新链接被看到的周期会明显拉长。如果站点抓取压力不大,没有必要设置过大的值。

robots.txt 本身返回异常

  • 返回 404:一般视为没有限制,允许抓取,属于正常情况。
  • 返回 5xx 或超时:多数爬虫会保守处理,短时间内减少甚至暂停对该主机的抓取,这类影响的面比单条规则更大。
  • 返回 200 但内容是 HTML 或空白页:解析失败,蜘蛛的实际行为不可预期。
  • HTTP 与 HTTPS 各有一份且内容不同:改规则时只改了其中一份,另一份仍在挡。

按蜘蛛视角逐步核对

  1. 用工具直接请求 robots.txt,确认状态码、内容类型和实际返回内容,观察 CDN 或 WAF 是否改写了它。
  2. 确认蜘蛛访问的是哪个域名与协议版本,与自己浏览器打开的是否一致。
  3. 把入口页的完整 URL 与规则逐条比对,注意路径大小写、结尾斜杠、查询参数。
  4. 查看服务器日志中 robots.txt 的请求记录,确认蜘蛛读取正常,而不是偶尔 5xx。
  5. 修改后重新观察日志,看入口页的请求是否恢复,而不是只看一次结果就下结论。

页面级设置的边界

页面里的 meta robots 与响应头里的 X-Robots-Tag 不会阻止抓取,它们影响的是收录和链接传递。入口页写成 noindex 时,蜘蛛通常仍会读取页面上的链接;如果同时加了 nofollow,可用的发现路径就只剩 sitemap 与外部链接了。

几个实操建议

  • robots.txt 越短越好,只保留必须挡住的目录。
  • 优先使用具体路径,少用通配符;必须放行时补一条明确的 Allow。
  • 改动前先备份,改动后至少观察几天日志再判断效果。
  • 不要把后台路径、接口地址写进 robots.txt,那等于把目录结构公开一遍。

robots.txt 是一份很小的文件,但它决定了蜘蛛能否走到入口页这一步。链接密度、抓取节奏、响应速度这些优化,都排在它之后。