在蜘蛛池入口頁里维護目标 URL 列表时,同一個頁面经常出現几種寫法混用:http 和 https 各寫一遍,带 www 和不带 www 各寫一遍,有的带结尾斜杠、有的不带,路径大小寫也不统一。這些寫法在浏览器里通常都能打開同一個頁面,但在搜尋蜘蛛眼里,它們未必是同一個地址。
搜尋蜘蛛是按 URL 字符串分別排队抓取的
抓取調度围绕具体的 URL 字符串進行。入口頁里的每個連結會先被解析成绝對地址,再進入待抓取队列。如果同一個頁面在入口頁里以四種寫法出現,搜尋蜘蛛很可能把它們当成四個待抓取地址,分別發起請求,分別占用抓取资源。
重复抓取本身不一定會立刻出問题,真正麻烦的是後續:這几個地址各自返回什么狀態碼、是否發生跳轉、頁面里的 canonical 指向哪里。如果處理得不一致,原本集中在一個地址上的信号會被分散。
协议寫法:http 與 https
如果 http 版本返回 301 跳到 https,搜尋蜘蛛會跟到 https 地址,一般不會造成長期重复。但如果两個协议都返回 200 且内容相同,同一份内容就有了两個可訪問入口,抓取和後續判断都會變得模糊。入口頁里最好只保留目标站實际生效的那一種寫法。
主机名寫法:带 www 與不带 www
這和协议属于同一類問题。两個主机名都能正常返回 200 时,搜尋蜘蛛没有理由自動認定哪個是主站,它會把两者分別抓取。建议在入口頁统一成目标站真正對外使用的那一個,另一個通過服務器端 301 收敛過去。
尾斜杠與路径大小寫
带尾斜杠和不带尾斜杠的地址,在部分服務器上會返回两個不同结果,有的會 301,有的干脆各返回一份 200。路径大小寫同理,很多服務器区分大小寫,两個僅大小寫不同的地址就是两個资源。入口頁生成連結时,最好按目标站實际可訪問的形式固定下来,不要凭习惯随手寫。
重复抓取會带来哪些實际問题
- 抓取资源被摊薄:同一份内容占用多個抓取名額,入口頁數量多时更明顯。
- 日誌难以分析:分不清實际抓取了哪些地址,排查时容易被表面現象带偏。
- 信号不一致:不同寫法返回的标题、canonical、狀態碼若有差异,判断會更乱。
- 跳轉鏈拉長:寫法混用往往伴随多层跳轉,增加單次抓取失敗的概率。
入口頁連結寫法的统一清單
- 先确定目标站的主域名和协议版本,把它作為唯一标准寫法。
- 入口頁里所有連結都寫成绝對地址,避免相對路径在不同入口頁上解析出不同结果。
- 统一是否带结尾斜杠,按目标站真實可訪問的形式来。
- 路径大小寫與原站保持一致,不要自行改寫或美化。
- 目标站若存在舊寫法入口,用 301 收敛到标准地址,而不是让它們繼續返回 200。
- 定期用服務器日誌或抓取工具核對,看看入口頁實际产生了多少種請求地址。
寫法混用大多是维護疏忽造成的,不是搜尋蜘蛛刻意多抓。把入口頁里的地址收敛成一套,通常比事後在目标站反复补 canonical 更省事。
需要說明的是,搜尋引擎對 URL 的規范化處理一直在調整,不同寫法最终會不會被合並,取决于服務端跳轉設定、頁面内的 canonical 指向以及内容是否一致。入口頁能控制的部分,是尽量少制造有歧义的地址,剩下的交给目标站自己的規范化配置去處理。