URL 是蜘蛛判断頁面是否重复的第一道线索
蜘蛛池里入口頁數量往往不少,真正影响蜘蛛愿不愿意繼續抓、會不會反复抓的,除了頁面内容本身,還有 URL 的寫法。對蜘蛛来说,URL 是最基本的去重依據:同一個頁面對應多個地址,或者一批地址長得几乎一样,抓取预算就容易耗在重复劳動上,真正想让它看到的頁面反而被挤掉。
URL 结构不是玄学技巧,更像是一種减少歧义的基础工作。下面几個方面值得單獨拿出来過一遍。
長度:不必刻意短,但要避免無意义堆叠
常见的说法是 URL 越短越好,其實蜘蛛並不會因為地址長就拒绝抓取。真正的問题在于長度往往伴随信息冗余。比如把栏目名、關鍵詞、日期、编号一层层拼進去,最後得到一條又長又难讀的地址,人看不出重点,蜘蛛也拿不到額外的判断依據。
可讀性主要是给运营自己看的
一條结构清楚的 URL,在日誌里排查問题时能省很多時間。看到 /topic/123 大概知道是什么頁面,看到一長串拼接字符就只能回去查表。所以長度控制在能表達层級即可,不必為了短而把有用信息全砍掉。
參數:能用,但要控制數量和顺序
動態參數是入口頁最容易失控的地方。带參數的地址本身没問题,問题在于參數一旦被複製、追加、換序,同一個頁面就能裂變出很多條地址。
- 跟踪參數:utm_source、from、ref 這類參數不要留在入口頁的預設連結里。它們對蜘蛛没有意义,却會让同一頁面出現多個版本。
- 排序與分頁參數:如果入口頁支持排序,尽量固定一種預設顺序,不要让人和蜘蛛都能從任意排序進入。
- 參數顺序:同一组參數在不同連結里保持顺序一致,避免 ?a=1&b=2 和 ?b=2&a=1 被当成两條地址。
- 空參數:?type= 這種没有值的參數尽量不出現,容易被解析成獨立地址。
静態化與伪静態:形式不同,重点在稳定
真静態的 .html、伪静態的 /a/123.html、纯路径的 /topic/123,蜘蛛都能抓。它並不区分這些形式,真正關心的是地址是否稳定、是否唯一、訪問是否正常。
伪静態需要服務端做重寫,這里有個容易踩的点:如果重寫規則過于宽松,把不存在的路径也返回正常頁面,就會凭空制造出大量内容相同的地址。宁可让不存在的地址明确返回 404,也不要让它返回一個空壳頁面。
大小寫、结尾斜杠與编碼:小事,但會制造重复
- 大小寫:在很多服務器上,/Abc 和 /abc 是两個不同地址。入口頁連結里如果大小寫混用,等于自己给自己制造重复。
- 结尾斜杠:/list 和 /list/ 是否指向同一頁面,取决于服務器配置。最好统一一種寫法,並在服務端把另一種跳轉過去。
- 中文與特殊字符:带中文或空格的地址會被编碼成百分号形式,编碼方式不一致时,同一頁面可能出現多種寫法。能用英文和數字就用英文和數字。
同一内容出現多個 URL 时怎么處理
入口頁做多了,多地址指向同一内容几乎难以避免。處理思路大致是三條:
- 能用 301 合並的,直接跳轉到一個主地址,让蜘蛛只認一條。
- 跳轉不方便的,在頁面里用規范連結声明主地址,作為一種补充說明。
- 站内連結统一指到主地址,別一會儿鏈這個版本,一會儿鏈那個版本。
規范連結是提示,不是强制命令。如果站内連結、跳轉和規范声明互相矛盾,蜘蛛多半會按自己的判断来,效果就打折了。
几個常见的坑
- 入口頁地址里带随机字符串或時間戳,每次生成都是新地址。
- 把本该做參數的篩選條件硬塞進路径,越筛路径越長。
- 地址里带 session id 之類的會话标识,同一用戶每次訪問都是新 URL。
- 改版後舊地址直接删掉返回 404,没有做跳轉,原有的訪問路径断掉。
上线前花十分钟過一遍
- 随机抽几條入口頁地址,看看是否存在大小寫、斜杠、參數顺序不一致的情况。
- 確認不存在的路径返回的是 404,而不是一個内容空白的正常頁面。
- 检查站内連結是否都指向同一個主地址版本。
- 翻一遍日誌,看看有没有明顯是同一頁面却占了很多條记錄的地址。
URL 结构不是用来讨好蜘蛛的技巧,而是把歧义提前消掉的基础工作。重复地址少一点,蜘蛛的抓取才更可能落在真正有内容的頁面上。