robots.txt 管的是能不能来,不是能不能收录
很多站长把 robots.txt 当成收录开关,其实它只回答一个问题:蜘蛛可以请求站点上的哪些地址。它不负责让页面被收录,也不负责让页面从搜索结果里消失。被 Disallow 的地址如果已经被收录,通常还会留在索引里,因为蜘蛛拿不到内容,无法确认该页面已经消失或者该被移除。
想让页面明确退出索引,用 noindex 更直接。想让蜘蛛别把抓取预算浪费在无意义的地址上,robots.txt 才合适。
User-agent 分组怎么匹配
文件由若干组构成,每组以一个或多个 User-agent 行开头,后面跟着规则行。蜘蛛一般只读取与自己相关的那一组。
- 写了具体名称的分组优先于写 * 的分组,针对某个蜘蛛的规则会覆盖通用规则。
- 同一组内有多条规则时,通常按路径匹配长度决定优先级,越具体的规则越优先,而不是简单按书写先后顺序。
- 没有匹配到任何分组的蜘蛛,按 * 组处理;如果连 * 组也没有,一般视为无限制。
所以最后补一条 Disallow: / 就想兜底的想法要谨慎,分组之间的关系取决于具体实现,把通用规则和专项规则混在一起,容易出现和预期相反的结果。
通配符和目录拦截的常见写法
多数主流蜘蛛支持 * 和路径末尾的 $。前者表示任意字符序列,后者表示路径结束。
- Disallow: /search 会拦住所有以 /search 开头的路径,包括 /searching。如果只想拦搜索页,通常要写 /search? 或配合 $ 使用。
- Disallow: /*? 用来拦带查询参数的地址,但可能误伤真正需要被抓的详情页。改动前先看日志里这些地址的抓取情况。
- Disallow: /*.pdf$ 只拦 PDF,不影响同目录下的 HTML 页面。
规则写得越宽,越容易误伤。动手之前先从服务器日志里筛出实际被蜘蛛抓过的路径,再决定拦哪些,而不是凭感觉写一条目录级的 Disallow。
Crawl-delay 是不是调节抓取频次的好办法
Crawl-delay 的作用常被高估。它并非所有蜘蛛都支持:主流搜索引擎中有的明确不支持,抓取节奏主要由站点响应速度和抓取预算自行调节;部分蜘蛛会读取,但取值往往只是一个参考。
更实际的做法是让服务器自己扛住压力:缩短动态页面的响应时间、给数据库和页面加缓存、在高峰期收敛一些非必要接口的抓取。与其在 robots.txt 里写一个很大的延迟值,不如把首字节时间降下来,蜘蛛在同一时间窗口里能抓的页面反而更多。
几个容易踩的坑
- 用 robots.txt 屏蔽整站来做临时下线,蜘蛛抓不到内容,恢复之后重新建立抓取节奏要花时间。
- robots.txt 返回 5xx。这通常被当作服务器错误,蜘蛛可能暂停抓取,也可能把已有的限制当作失效,风险比返回 404 更大。文件读取失败时要有可用的兜底。
- 把 Sitemap 地址写在 robots.txt 里,却把 Sitemap 中的地址用 Disallow 拦掉,两处规则互相矛盾。
- 改版时忘了更新规则,旧目录的 Disallow 还留着,而新目录的地址正好落在里面。
- 用 Disallow 拦分页页和筛选页,同时又在 Sitemap 里提交这些地址,让蜘蛛收到相反的信号。
什么时候该动 robots.txt
它适合处理三类问题:拦掉技术上抓取就出错或者没有任何内容的地址、向蜘蛛说明站点的抓取边界、声明 Sitemap 的位置。它不适合处理的事情包括:让页面被收录、让页面掉出排名、加速索引。
改 robots.txt 之前,先确认想拦的地址确实没必要被抓,并想清楚这些地址现在有没有被收录、拦掉之后会发生什么。
改完之后观察一段时间的服务器日志,看蜘蛛对这些路径的请求是否减少、有没有出现意外的 403、抓取总量有没有整体下滑,再决定是保留还是回退。一次只改一处,比一次性重写整个文件更容易定位问题。