很多站点一開始只有一個域名,後来慢慢長出了 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 更有實际意义。