做蜘蛛池的时候经常遇到这种情况:入口页能正常打开,里面指向的目标 URL 却迟迟没有被抓。排查到最后,问题出在 robots.txt 上——有人为了挡住后台、站内搜索这类无价值路径,写了一条很宽的 Disallow 规则,顺手把目标 URL 也一起挡了进去。这篇文章把这条链路上的几个关键点拆开说清楚。
先确认被屏蔽的到底是哪一层
robots.txt 的生效范围是「同一个协议 + 同一个主机名 + 同一个端口」,也就是常说的同源。所以要先分清三种情况:
- 入口页本身被屏蔽:搜索蜘蛛根本不会请求入口页,页面里有多少条链接都读不到,链路在第一层就断了。
- 入口页可抓,目标 URL 所在路径被屏蔽:入口页能被读取,蜘蛛也能看到链接,但走到目标 URL 时会被规则拦住,不会去请求正文。
- 目标 URL 在另一个域名:入口页的 robots.txt 管不到对方,这时候要看目标站自己的 robots.txt 有没有屏蔽搜索蜘蛛。
搜索蜘蛛遇到 Disallow 时具体会做什么
需要区分「发现 URL」和「抓取 URL」两件事。搜索蜘蛛在别的页面看到一条被 Disallow 的链接时,通常仍可能把这个 URL 记录下来,但它不会去请求这个 URL 的内容。对蜘蛛池来说,后果很直接:
- 目标 URL 的内容读不到,页面里的下一层链接也就无从发现;
- 入口页里如果大量链接都落在被屏蔽的路径下,入口页本身的抓取价值会被明显稀释;
- robots.txt 不是保密工具,它只是抓取指令,不保证 URL 不出现。想要内容不被看到,应该用权限控制,而不是 Disallow。
几个常见的误判
- 规则顺序误区:很多人以为 robots.txt 是从上往下匹配第一条。实际生效的是匹配程度,规则更具体、更长的通常优先,所以不要靠调换顺序来「覆盖」。
- 通配符误伤:像 /go/* 这种写法会把所有以 go 开头的路径全挡住,包括你本来想放行的目标 URL。
- robots.txt 本身异常:如果这个文件返回 5xx,多数搜索引擎会保守处理,可能短时间内减少对该主机的抓取;返回 404 一般视为没有限制;但如果返回 200、内容却是一个错误页,解析结果就不可预料了。
一条实用经验:写完 robots.txt 别只看语法对不对,要实际拿目标 URL 去跑一遍抓取测试,看结果里有没有「被 robots.txt 屏蔽」的提示。
想保留入口页、只屏蔽无关目录,怎么做
- 先列出真正无价值的路径,比如后台、站内搜索、参数化筛选页,只对这些路径写规则。
- 逐条核对目标 URL 的完整路径,确认不在任何 Disallow 的前缀里,尤其注意结尾有没有通配符。
- 用搜索引擎提供的抓取测试工具,分别测入口页和目标 URL,确认两者都不被拦。
- 过几天回到服务器日志里,搜目标 URL 的请求记录,看是否有来自搜索蜘蛛的访问。日志比任何推测都可靠。
目标 URL 在别的域名时
跨域的情况下,两边的 robots.txt 各自独立。入口页放行不等于目标站放行,反过来也一样。实际排查时经常见到入口页一切正常、目标站自己写了 Disallow,或者整站被 WAF 拦掉,抓取断点其实在后面那一段。所以跨域投放时,两边的 robots.txt 和访问控制都要过一遍。
怎么快速验证
- 直接访问 你的域名/robots.txt,确认返回 200 且内容是规则文本,不是首页也不是错误页。
- 把目标 URL 粘进抓取测试工具,看是否提示被 robots 屏蔽。
- 检查服务器日志里入口页的抓取次数与目标 URL 的请求次数,两者的差距往往就是断点位置。
- 如果入口页被大量抓取而目标 URL 一条请求都没有,优先怀疑 robots 规则、重定向链以及目标站的拦截策略。
小结一下:robots.txt 决定的是「能不能抓」,不是「会不会被收录」。入口页与目标 URL 之间只要有一层被 Disallow,发现与抓取的链路就会断开。排查顺序建议是:robots.txt 规则 → 抓取测试工具 → 服务器日志 → 目标站自身的访问控制,一层层往下定位,比盲目堆链接有效得多。