蜘蛛判断一個地址抓過没有,比對的是完整的 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 出現,頁面之間也容易互相争夺相似的主题判断。
怎么把重复地址找出来
- 從服務器日誌里按路径聚合,暂时去掉查询參數再統計請求量,看有没有只差大小寫、斜杠或預設文档的成對路径。
- 检查内鏈和 Sitemap 用的是哪種寫法,两邊是否一致。
- 手動用不同寫法各請求一次,看服務器返回 200 還是 301。
- 检查頁面上的規范标簽指向的地址,是否和實际訪問地址完全一致。
统一到一種寫法
最直接的做法是在服務器层做 301:把带 www 的跳到不带 www(或反過来),把 http 跳到 https,把 /index.html 跳到目錄根,把缺尾斜杠和多尾斜杠统一成一種。301 是明确指令,蜘蛛會沿着它走到規范地址,抓取也會逐步集中過去。
規范标簽值得用,但要清楚它只是提示,並不阻止抓取。變体地址如果仍然返回 200,蜘蛛可能還是會去請求一遍。真正减少重复抓取的是两件事一起做:服務器统一跳轉,加上站内連結寫法一致。
几個容易踩的坑
- 用 JS 跳轉或 meta refresh 代替 301:蜘蛛需要額外處理或等待,指向關系也不如 301 明确。
- 用 robots.txt 屏蔽規范變体:屏蔽之後蜘蛛在變体頁上看不到規范标簽,判断反而更模糊。
- 只改 Sitemap 不改内鏈:清單里的寫法對了,頁面上几百條連結還在用舊寫法,收敛效果有限。
- 參數變体一刀切屏蔽:如果某些參數确實會改變頁面内容,屏蔽可能誤伤真實頁面,先確認參數是否影响呈現。
重复抓取通常不是蜘蛛抓错了,而是服務器允许同一份内容有多個入口。把入口收敛到一個,抓取量才有机會用在真正的新頁面上。