做蜘蛛池的人常遇到一个矛盾:入口页不想被普通访客或搜索蜘蛛直接看到,于是用 robots.txt 把入口页 Disallow 掉,过一段时间回头看,里面的目标 URL 一条抓取记录都没有。这时候要先问自己一个问题:你屏蔽的到底是入口页,还是入口页加上里面的目标 URL?在 robots.txt 的规则体系里,这是两件完全分开的事。
robots.txt 的拦截发生在抓取之前
搜索蜘蛛在请求某个 URL 之前,会先读取该站点的 robots.txt(通常会缓存一段时间)。如果某条规则匹配上了这个 URL,蜘蛛一般就不再发出请求。由此可以推出:
- 入口页被 Disallow,蜘蛛大概率不会去抓入口页,读不到它的 HTML,自然也就读不到页面里的链接。
- 目标 URL 没有被 Disallow,它本身仍然是可抓取的,只是少了一条被暴露出去的通道。
所以最常见的实际情况是:入口页被屏蔽后,目标 URL 并不是被禁止了,而是失去了主要的发现路径。
几个容易混淆的点
误区一:以为 robots.txt 只影响收录
robots.txt 控制的是抓取,不是收录。一个 URL 被 Disallow 之后,蜘蛛不能抓取它,也就无法读取页面内容来判断它是什么。但它仍然可能通过外部链接、sitemap 等渠道被记录成一个「已知但未抓取」的 URL。反过来说,允许抓取也不等于会被收录。
误区二:以为屏蔽入口页会连坐目标 URL
robots.txt 的规则是按 URL 路径逐条匹配的,不会向被链接的页面传递「禁止」。入口页被屏蔽,不代表它指向的目标 URL 也被屏蔽;目标 URL 被屏蔽,也不影响入口页本身被抓取。
误区三:以为把 URL 放进 sitemap 就能绕过 Disallow
sitemap 里的 URL 如果同时命中 robots.txt 的屏蔽规则,蜘蛛一般还是不会去抓。sitemap 更像是一份推荐清单,robots.txt 更像门禁,门禁优先。
四种组合下的实际表现
- 入口页允许、目标 URL 允许:最正常的情况。蜘蛛抓入口页,解析出链接,再按调度去抓目标 URL。
- 入口页屏蔽、目标 URL 允许:蜘蛛不会读入口页,里面的链接等于没写。目标 URL 只能靠其它入口、外部链接或 sitemap 重新被发现。
- 入口页允许、目标 URL 屏蔽:蜘蛛能发现这些链接,但请求会被挡下来,目标 URL 会长期停留在「已发现、未抓取」的状态。
- 两边都屏蔽:发现和抓取两条路都断了,入口页在整条链路里基本等于不存在。
如果确实需要屏蔽入口页,可以这样调整
- 把目标 URL 放到另一个可抓取的页面上,让发现路径不再依赖被屏蔽的那个入口页。
- 检查 Disallow 规则的写法,避免用过于宽泛的前缀把目标 URL 的路径一起罩进去。
- 如果只是不想让入口页被正常展示,但希望链接能被读到,可以考虑保留抓取、改用其它方式处理入口页内容。这类做法需要结合自身站点评估,不存在通用的稳妥方案。
- 用官方或第三方的 robots.txt 测试工具,逐个验证入口页和目标 URL 各自命中哪条规则,不要凭感觉判断。
建议的排查顺序
如果入口页有抓取记录、目标 URL 却完全没有动静,可以按下面的顺序逐条看:
- 入口页和目标 URL 分别命中 robots.txt 的哪一条规则,是否存在误伤。
- 入口页响应是否正常,返回的 Content-Type 是不是 text/html。
- 链接是否真实存在于 HTML 源码中,而不是靠脚本渲染后才出现。
- 目标 URL 自身返回的状态码是否可抓取。
- 服务端日志里,目标 URL 有没有被请求过的痕迹。
robots.txt 拦的是「抓不抓」,不是「好不好」。把入口页屏蔽掉,通常只是让目标 URL 少了一条被发现的路,并不会让它在别的地方更快被处理。
最后提醒一句:不同搜索引擎的抓取调度策略并不一致,同一套配置在不同站点上的表现也可能有差别。上面的内容是常规规律,具体还是以自己站点的抓取日志和后台数据为准。