常见問题

目标 URL 大小寫、斜杠、端口寫得不一致,搜尋蜘蛛會当成多個頁面抓取吗

蜘蛛池入口頁里同一條目标 URL,寫法稍有不同就可能被当成几條連結。主机名大小寫、預設端口、尾部斜杠、查询參數顺序、URL 编碼這几處最容易出岔子。本文說明搜尋蜘蛛如何判断是不是同一個 URL,以及入口頁連結该怎样统一寫法,减少抓取額度被同一個頁面反复消耗。

常见問题

目标 URL 大小寫、斜杠、端口寫得不一致,搜尋蜘蛛會当成多個頁面抓取吗

整理蜘蛛池入口頁时,经常會看到同一個目标 URL 有好几種寫法:有的带尾部斜杠,有的不带;有的把主机名首字母寫成大寫;有的把 80 端口明明白白寫進地址里。在人看来這明顯是同一個頁面,但在搜尋蜘蛛眼里不一定。搜尋蜘蛛抓到連結後,會先對该地址做一轮規范化處理,處理完仍然對不上的,就會被当作另一條地址,單獨排進抓取队列。

搜尋蜘蛛是怎么判断两個 URL 是不是同一個的

大致會走這么几步:

  • 协议和主机名统一成小寫,比如 HTTP://Example.com/ 會向 http://example.com/ 靠拢;
  • 解析相對路径,把 .././ 這類寫法還原成完整路径;
  • 對部分預設端口做归一,比如 http 的 80、https 的 443;
  • 處理地址里的片段标识符,也就是 # 後面的部分,通常只影响頁内定位,不构成新地址。

但規范化是有邊界的。它不會替你做服務端的跳轉统一,也不會自動判断尾部斜杠、查询參數顺序這類差异到底算不算同一個頁面。換句话说,能归一的它會归,归一不了的差异就會保留下来。

入口頁里最容易出岔子的几個寫法

主机名大小寫

域名本身大小寫不敏感,搜尋蜘蛛一般會按小寫處理,這一處出問题的概率相對低,但仍然建议入口頁里统一寫成小寫,省得日誌里两種形態混着出現、看統計时對不上号。

預設端口

:80 和不带,多數环节會归一,但中間只要有一层跳轉或代理没處理干净,就可能留下两個版本。入口頁里寫連結时,預設端口干脆不要寫。

尾部斜杠

這是最常见的一處。/a/a/ 在技術上是两個地址,除非服務端明确做了 301 统一。很多站点两種情况都能正常打開,返回的都是 200,于是搜尋蜘蛛就把它們当成两條 URL 分別抓。入口頁里混着寫,等于把同一頁面的抓取次數翻倍。

查询參數顺序

?a=1&b=2?b=2&a=1 在部分系統里會被视為不同地址。如果入口頁是程序批量生成的,參數拼接顺序不稳定,就很容易产出大量實质相同的連結。

跟踪參數與 URL 编碼

utm 一類的統計參數、會话參數,會让同一條目标 URL 派生出很多變体;编碼层面,%7E 和 ~、中文的编碼與未编碼寫法,也可能被解析成不同结果。入口頁面向搜尋蜘蛛,最好只保留必要的裸地址。

寫法不一致會带来什么實际影响

  • 同一個頁面被反复抓取,抓取額度被白白消耗,真正需要更新的頁面反而排队更久;
  • 日誌里出現多條相似记錄,統計訪問量、判断哪條 URL 被抓過时容易誤判;
  • 入口頁連結分散到多個變体上,你很难说清到底哪一條才是你希望被抓的那一條。

蜘蛛池入口頁统一寫法的做法

  1. 先给每條目标 URL 定一個規范形態,明确带不带尾部斜杠、带不带 www,然後寫進入口頁的生成規則里,不再手工临场發挥。
  2. 入口頁里的連結尽量用统一格式輸出,要么全部寫绝對地址,要么全部寫相對路径,不要两種混用,避免解析基准不一致。
  3. 在服務端做一层 301,把非規范形態永久指向規范形態,让搜尋蜘蛛不管拿到哪種寫法,最终都落到同一個地址上。
  4. 站点地图和主動提交的地址,只放規范形態。變体地址不要重复提交,否則等于自己给自己制造重复。
  5. 隔一段時間用日誌或抓取工具核對一次,看看搜尋蜘蛛實际抓的是哪几條地址,和你的预期是否一致。

已经乱了怎么收拾

如果入口頁已经产生了大量變体連結,不用急着全删。先把日誌按地址聚類,找出被抓次數最多、但内容相同的几條,判断哪一條是規范形態,再改入口頁的生成規則,並在服務端补上跳轉。已经散出去的舊連結不用刻意去動,让跳轉慢慢把它們收拢過来即可。

規范化只解决“同一頁面被当成多條地址”這一類問题,它减少的是重复抓取,並不等于頁面會被收錄,也不代表抓取频率會立刻變化。收錄與否,還要看頁面内容本身和站点整体情况。