入口页的链接排布、响应速度、链接深度都调好了,日志里却始终看不到搜索蜘蛛的请求 —— 这类情况下,问题往往不在页面本身,而在抓取前的那一步: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 各有一份且内容不同:改规则时只改了其中一份,另一份仍在挡。
按蜘蛛视角逐步核对
- 用工具直接请求 robots.txt,确认状态码、内容类型和实际返回内容,观察 CDN 或 WAF 是否改写了它。
- 确认蜘蛛访问的是哪个域名与协议版本,与自己浏览器打开的是否一致。
- 把入口页的完整 URL 与规则逐条比对,注意路径大小写、结尾斜杠、查询参数。
- 查看服务器日志中 robots.txt 的请求记录,确认蜘蛛读取正常,而不是偶尔 5xx。
- 修改后重新观察日志,看入口页的请求是否恢复,而不是只看一次结果就下结论。
页面级设置的边界
页面里的 meta robots 与响应头里的 X-Robots-Tag 不会阻止抓取,它们影响的是收录和链接传递。入口页写成 noindex 时,蜘蛛通常仍会读取页面上的链接;如果同时加了 nofollow,可用的发现路径就只剩 sitemap 与外部链接了。
几个实操建议
- robots.txt 越短越好,只保留必须挡住的目录。
- 优先使用具体路径,少用通配符;必须放行时补一条明确的 Allow。
- 改动前先备份,改动后至少观察几天日志再判断效果。
- 不要把后台路径、接口地址写进 robots.txt,那等于把目录结构公开一遍。
robots.txt 是一份很小的文件,但它决定了蜘蛛能否走到入口页这一步。链接密度、抓取节奏、响应速度这些优化,都排在它之后。