蜘蛛在頁面上看到連結时,拿到的是一串字符,而不是一個已经確認過的頁面。它只能照着這串字符去發請求。所以連結寫法的差异,會直接變成抓取行為的差异:同一份内容可能被請求三次四次,也可能因為寫法不對而压根没人請求。
蜘蛛眼里的 URL 只是字符串
在浏览器里,很多寫法差异會被自動抹平:大小寫會自動纠正,多余斜杠會被忽略。但蜘蛛不會替你猜,它抓的是字符串本身。下面這几類差异最常见。
主机名與路径的大小寫
按規范,域名不区分大小寫,路径区分大小寫。但不少服務器是大小寫不敏感的,于是 /About 和 /about 都能返回 200。蜘蛛看到两個不同字符串、两個都是正常頁面,就會分別抓取、分別入库。同一份内容被记成两條记錄,内鏈權重也被拆開。
结尾斜杠
/page 和 /page/ 也是两個字符串。如果服務器對两者都返回 200 而不做重定向,蜘蛛就會把它們当成两個地址。這類問题在栏目頁、标簽頁上尤其多,因為不同編輯、不同模板輸出的寫法可能不一致。
中文、空格與百分号编碼
同样一個标簽頁,可能被寫成原始中文,也可能被寫成百分号编碼形式,還可能把空格寫成加号。對蜘蛛来说這是三個字符串。搜尋引擎通常會做一定程度的编碼归一,但归一不是保證,尤其是编碼层級不同、字符被二次编碼时。
參數顺序與無用參數
?a=1&b=2 和 ?b=2&a=1 指向的内容完全一样,字符串却不一样。再加上排序參數、来源追踪參數、分頁參數的不同排列组合,一個列表頁可以轻易膨胀出几十個地址。
相對路径與多余的路径符号
相對路径、以双斜杠開头的寫法、路径里插入的点号,蜘蛛都會尝试解析。解析结果有时和你以為的地址並不一致,特別是頁面本身层級較深、或者被放在不同目錄下渲染时。
哪些寫法蜘蛛基本不會去請求
除了重复,還有一類問题更直接:連結根本没被当成連結。
- 用脚本事件挂上去的假連結,没有可用的地址属性。
- 只寫了井号或空值的锚点,指向目前頁面自身。
- 邮件、电话协议開头的地址,不属于網頁抓取范围。
- 表單提交、按钮点击後才生成的跳轉,不产生可抓取的連結。
- 纯文本粘贴的地址,没有可点击标记,被识別的概率不稳定。
這些寫法在用戶视角能点、能跳,但在抓取视角里,路径就断在這里。
把每個頁面收口到一個地址
與其事後分析重复抓取,不如在輸出环节就统一。可以按這個顺序處理:
- 為每類内容确定唯一标准寫法,包括大小寫、是否带结尾斜杠、编碼方式。
- 在服務器层面對變体做永久重定向,重定向比注释類声明更硬。
- 统一内鏈輸出,让模板、面包屑、相關推荐都走同一套地址規則。
- 用規范化声明做兜底,處理那些無法重定向的變体,比如带追踪參數的地址。
- Sitemap 里只放标准版本,不要把變体也列進去。
顺序很重要:先重定向、再统一内鏈,最後才是声明。把所有希望都压在一行声明上,效果通常不理想。
上线前後可以做的几項检查
- 翻抓取日誌,按路径統計大小寫變体、斜杠變体各被請求了多少次。
- 抽查栏目頁和标簽頁,看同一目标是否混用了两種寫法。
- 把内鏈里出現的地址與 Sitemap 對照一遍,看有没有對不上的。
- 检查參數拼接逻辑,固定參數顺序,去掉無意义的空參數。
- 看服務器是否對變体返回了重定向,還是直接给了 200。
抓取资源不是省出来的,是別浪費出来的。同一份内容被寫成多個地址,是最容易被忽视的一種浪費。
連結寫法看起来是前端细节,落到抓取上却是很實在的路径問题。把地址收口這件事做干净,蜘蛛拿到的路径更短、更明确,站点也少了一堆重复的抓取记錄。