判断一個頁面是否被收錄,大多數人先看内容,再看标簽。但在爬虫眼里,頁面的第一身份是 URL。同一個頁面如果存在几種不同的 URL 寫法,它就不是一個頁面,而是几個待處理的地址。這些地址會各自排队、各自抓取,最後在索引里形成互相竞争的结果。
下面按几種最常见的寫法差异,说说它們分別會带来什么問题,以及怎么查。
為什么同一頁面會出現多個 URL
URL 的重复很少是故意造成的,多數来自几個日常動作:站内連結從不同位置生成时大小寫没统一;導航里寫的是带斜杠的目錄形式,正文連結寫的是不带斜杠的形式;分享連結被加上了追踪參數;後台切換過 CMS 或做了伪静態,舊寫法仍然能訪問。只要其中任何一種寫法返回正常頁面,它就有可能被單獨抓取。
大小寫:先確認服務器是否区分
是否区分大小寫,取决于服務器和系統环境。Linux 上常见的 Nginx、Apache 預設区分大小寫,/News 和 /news 是两個不同的地址;Windows 环境下的 IIS 通常不区分。同一個站如果換過服務器,情况還可能發生變化。
- 用两種寫法分別訪問,看是否都返回正常内容。
- 如果都返回 200 且内容相同,說明這两個地址都在對外供應同一個頁面。
- 看頁面里的 canonical 指向哪一個,確認自己声明的首選版本。
處理方式通常是二選一:要么让非首選寫法 301 跳到首選寫法,要么统一站内所有連結的寫法,让另一種寫法根本不出現在頁面上。
结尾斜杠:目錄形式和文件形式
带斜杠和不带斜杠往往被服務器当作两個地址。/about/ 和 /about 如果都能打開同一個頁面,就等于對外提供了两個入口。常见做法是選一種作為首選,另一種用 301 跳過去。選哪一種不重要,重要的是站内連結、sitemap、canonical 三處的寫法保持一致,不要一處带斜杠一處不带。
參數顺序與無用參數
參數類頁面最容易产生寫法分叉。參數的先後顺序不同,URL 字符串就不同,例如 ?type=1&page=2 和 ?page=2&type=1,服務器返回的内容完全一样,但爬虫看到的是两條地址。另外還有几類參數會持續制造新 URL:
- 来源追踪參數,如 utm_source、from、ref 之類。
- 會话或临时标识參數,如 sid、sessionid。
- 排序、篩選、每頁數量等可自由组合的參數。
能去掉的就不要在站内連結里带上;必须保留的,可以通過 URL 參數工具或服務器規則做归一處理。不要僅靠 robots.txt 去挡,那只阻止抓取,不解决地址重复。
中文與特殊字符的编碼
中文路径在传輸时會被编碼成 %E4%B8%AD 這样的形式。這里有一個容易被忽略的细节:十六進制字母的大小寫不同,编碼後的字符串也不同,%e4 和 %E4 在部分系統里被视作两個地址。如果站内不同位置生成的编碼大小寫不一致,同样可能分叉。更稳妥的做法是栏目和文章路径尽量使用英文或拼音,中文标题放在頁面的标题和 H1 里。
URL 長度與层級
层級過深的 URL 通常意味着内鏈入口少,爬虫要到更深處才能發現頁面,抓取频率也更容易變低。這不是说長 URL 一定不被收錄,而是它往往和站内结构問题一起出現。把重要内容放在較浅的层級,比事後調整 URL 更省事。
可以按這個顺序自查
- 抽查一批頁面,把站内指向它們的連結找出来,看是否存在大小寫、斜杠不一致的情况。
- 對比 sitemap 里寫的 URL 和頁面 canonical 声明的 URL,两者應完全一致。
- 用抓取工具批量訪問,记錄所有返回 200 但内容相同的地址,归類整理。
- 對確認重复的地址,确定一個首選版本,其余用 301 指向它。
- 回到頁面模板和編輯流程,從生成环节避免再次产生新寫法。
URL 寫法统一這件事,本质上不是為了让頁面更快被收錄,而是减少爬虫需要處理的重复地址,让抓取资源花在真正有内容的頁面上。處理完之後索引狀態會不會變化、多久變化,仍然取决于頁面本身的质量和站点整体情况,没有固定的時間表。