很多站点一开始只有一个域名,后来慢慢长出了 m 站、地区域名、活动独立域、静态资源域,甚至几个测试主机。URL 总量没变多少,但蜘蛛的抓取资源被拆到了多个主机上,于是常见的情况是:主站抓取频次下降,某个子域却天天被扫。理解蜘蛛怎么按主机记账,是把这件事理清楚的第一步。
蜘蛛是按主机分别记账的
抓取调度里,主机(更准确地说,是协议加主机名加端口的组合)是相对独立的单位。robots.txt、抓取频次、连接数控制、Sitemap 的归属,通常都以主机为边界生效。这带来两个直接后果:
- 一个主机抓得慢,不会自动把额度让给另一个主机,只是那个主机自己没抓满;
- 把内容铺到三个主机,等于让蜘蛛在三个地方分别学习、分别排队。
所以在讨论抓取预算之前,先承认它不是一个总池子,而是一组按主机划分的小池子。
先把主机清单画出来
在做任何调整之前,把所有能被蜘蛛访问到的主机列成一张表,并标出每个主机的角色:
- 承接索引的主力主机:正文、列表、详情页都在这里;
- 跳转主机:只做 301 或短链,页面上没有可索引内容;
- 资源主机:CSS、JS、图片;
- 附属主机:m 站、地区站、活动页、历史遗留域。
角色写清楚之后,很多问题会自己浮出来:跳转主机为什么还有内链入口?资源主机为什么被请求了正文页?
每个主机的发现通道要各自闭环
robots.txt 与 Sitemap 不要跨主机硬塞
Sitemap 文件里的 URL 应当与 Sitemap 自身同源,把跨主机的 URL 塞进主站的 Sitemap,通常不会被当成有效信号处理。比较稳妥的做法是:每个需要收录的主机各自有 robots.txt 和 Sitemap,再在主站的 Sitemap 索引里引用它们的绝对地址。
主路径尽量在同一主机内走完
从首页到详情页的跳转如果中途换主机,蜘蛛需要额外对陌生主机做一次判断,路径变长,成功率也更容易受影响。能让主路径留在主力主机里,就不要让它绕到附属主机再绕回来。
把抓取预算往需要收录的主机收
- 需要被索引的正文,集中到一个主机,附属主机只保留必要页面;
- 跳转主机上的旧 URL 用单跳 301 指向目标,不要再链式中转;
- 资源主机只在蜘蛛需要渲染时放开,明确不需要抓的路径可以在 robots.txt 里挡掉;
- m 站或地区站若与主站是同一套内容,用 canonical 或 hreflang 说明关系,而不是让两边各自被当作独立站点反复抓。
日志按 host 拆开看
把抓取日志汇总到一张表时,加上 host 字段,按主机分组后关注这几项:
- 每个主机每天被请求的总量与状态码分布;
- 主力主机的抓取量占全站的比例;
- 附属主机上被反复抓取、但从不产生有效页面的路径;
- 跳转主机的 301 是否都是单跳完成。
如果发现主力主机的抓取量在下降,而某个附属主机的请求量在上涨,通常说明入口或 Sitemap 里混进了不该出现的主机。
多主机本身不是问题,问题往往是同一份内容被多个主机同时声明为正式版本,蜘蛛只能自己挑一个。
几个容易踩的坑
- 为了看起来收录多,把同一批内容复制到多个域名,结果是互相稀释;
- 证书、DNS 解析或防火墙规则只配了主站,附属主机对蜘蛛不可达,链接变成死路;
- Sitemap 里混入跨主机 URL,提交后大量被忽略或直接校验失败。
多主机下的抓取问题,本质上不是让蜘蛛多来,而是让它在正确的主机上、沿着清晰的路径走完该走的页面。把主机清单、发现通道和日志对账这三件事定期过一遍,比反复手动提交 URL 更有实际意义。