搜尋抓取

同一個頁面被蜘蛛当成多個 URL:大小寫、斜杠與 www 的重复抓取

同一份内容如果可以用多種 URL 寫法訪問,蜘蛛會把它当成多個地址分別抓取,抓取配額和日誌都被分摊。本文整理大小寫、尾斜杠、預設文档、www 與跟踪參數等常见重复来源,以及如何用服務器 301、内鏈统一和日誌排查把抓取收敛到規范地址上。

搜尋抓取

同一個頁面被蜘蛛当成多個 URL:大小寫、斜杠與 www 的重复抓取

蜘蛛判断一個地址抓過没有,比對的是完整的 URL 字符串,而不是頁面内容。同一份内容只要能用两種以上的寫法訪問到,在它眼里就是两個甚至多個待抓取地址,會被分別排進队列。结果是抓取量被摊薄,日誌里多出一批看起来陌生的路径,排查收錄問题时很容易被带偏。

同頁多址最常见的几個来源

  • 大小寫差异:/About 與 /about、/images/Logo.png 與 /images/logo.png。Linux 环境路径大小寫敏感,服務器可能對两種寫法都返回 200。
  • 尾斜杠:/news 與 /news/ 在部分服務器配置下都能正常打開,而不是互相跳轉。
  • 預設文档:目錄根與 /index.html、/index.php 同时可訪問。
  • 主机名與协议:带 www 與不带 www、http 與 https,如果没有统一跳轉,就是四套地址。
  • 端口與路径冗余:example.com:80 與 example.com、/a//b 與 /a/b。
  • 跟踪參數與參數顺序:?utm_source=…、?ref=…,以及 ?a=1&b=2 與 ?b=2&a=1,内容往往完全一样。
  • 编碼寫法:中文路径的百分号编碼大小寫不同,空格被寫成 %20 或 +。

代價不只是多抓几次

重复地址會同时占用抓取額度、服務器连接和日誌空間。更麻烦的是信号分散:内鏈和外部連結如果指向不同寫法,蜘蛛拿到的關于哪個是主版本的信息就是矛盾的。同一内容以多個 URL 出現,頁面之間也容易互相争夺相似的主题判断。

怎么把重复地址找出来

  1. 從服務器日誌里按路径聚合,暂时去掉查询參數再統計請求量,看有没有只差大小寫、斜杠或預設文档的成對路径。
  2. 检查内鏈和 Sitemap 用的是哪種寫法,两邊是否一致。
  3. 手動用不同寫法各請求一次,看服務器返回 200 還是 301。
  4. 检查頁面上的規范标簽指向的地址,是否和實际訪問地址完全一致。

统一到一種寫法

最直接的做法是在服務器层做 301:把带 www 的跳到不带 www(或反過来),把 http 跳到 https,把 /index.html 跳到目錄根,把缺尾斜杠和多尾斜杠统一成一種。301 是明确指令,蜘蛛會沿着它走到規范地址,抓取也會逐步集中過去。

規范标簽值得用,但要清楚它只是提示,並不阻止抓取。變体地址如果仍然返回 200,蜘蛛可能還是會去請求一遍。真正减少重复抓取的是两件事一起做:服務器统一跳轉,加上站内連結寫法一致。

几個容易踩的坑

  • 用 JS 跳轉或 meta refresh 代替 301:蜘蛛需要額外處理或等待,指向關系也不如 301 明确。
  • 用 robots.txt 屏蔽規范變体:屏蔽之後蜘蛛在變体頁上看不到規范标簽,判断反而更模糊。
  • 只改 Sitemap 不改内鏈:清單里的寫法對了,頁面上几百條連結還在用舊寫法,收敛效果有限。
  • 參數變体一刀切屏蔽:如果某些參數确實會改變頁面内容,屏蔽可能誤伤真實頁面,先確認參數是否影响呈現。
重复抓取通常不是蜘蛛抓错了,而是服務器允许同一份内容有多個入口。把入口收敛到一個,抓取量才有机會用在真正的新頁面上。