在蜘蛛池里,入口頁的 URL 不只是一個地址,它是蜘蛛拿到頁面之前最先讀到的一手信息。同一批内容,URL 设計得干净還是混乱,日誌里的抓取分布往往差別很大。這一篇只谈 URL 本身:長度、层級、參數和唯一性。
蜘蛛從 URL 里先讀到什么
在下载頁面之前,蜘蛛要先做几個判断:這個地址是否已经抓過、是不是和已有頁面重复、值不值得排進抓取队列。如果 URL 里塞满無意义參數,或者同一個頁面能用好几個地址打開,這几件事都會變得困难。URL 不直接决定收錄,但它决定了蜘蛛有多少時間能花在真正的内容上。
長度與可讀性
URL 没有硬性的長度上限,但實践上,路径部分控制在几十到一两百個字符以内會比較稳妥。当路径長到几百字符、參數一長串时,在一些日誌记錄和抓取队列里容易被截断或降級處理,排查問题时也不方便。
可讀性方面,用连字符分隔的英文或拼音路径,比一串纯 ID 更好维護,也方便你在訪問日誌里快速定位是哪個入口頁。中文路径不是不能用,但编碼後會變成一長串 %E4%B8%AD,複製和排查都變麻烦,批量生成时也更容易出错。
目錄层級不要嵌套太深
建议入口頁到目标頁的层級控制在三层以内。层級深不代表蜘蛛抓不到,但每一层都要靠上一层的連結被爬過,中間某一层抓取失敗,整條鏈路就断了。扁平结构配合站内互鏈,通常比 a/b/c/d/page.html 這種深层路径更容易维護和統計。
參數怎么取舍
建议去掉的
- 追踪類:utm_source、gclid、fbclid 這類,會给同一個頁面派生出無數地址。
- 會话類:sessionid、PHPSESSID 等,每個訪客一個地址,在蜘蛛视角里就是一堆新 URL。
- 排序、篩選、视图類:?order=asc&view=list 這種组合,很容易被穷举出大量近似頁面。
可以保留的
如果參數确實是内容的一部分,比如詳情頁的 id、分頁的 page,可以保留,但要保證一個參數只有一個含义、取值范围可控。分頁建议统一成 page=2 這種寫法,不要同时存在 p=2、pg=2、start=10 三套。
唯一性:一個頁面只對應一個地址
這是最容易出問题的地方。常见的重复来源包括:
- 尾斜杠:/a 和 /a/ 被服務器当成两個地址
- 大小寫:/Page 和 /page
- 預設文件名:/a/ 與 /a/index.html
- 协议與域名:http 與 https、带 www 與不带 www
處理思路是在服務器层做 301 归一化,只保留一個版本,其他變体全部 301 到規范地址。不要用 302 或 meta refresh 代替,那样會让蜘蛛反复確認,浪費抓取次數。
生成 URL 时的几個誤区
- 把内容塞進 URL:整段标题或關鍵詞變成一長串拼音,改标题就得改地址,原有记錄和連結全部作废。
- 參數顺序不固定:?a=1&b=2 和 ?b=2&a=1 被当成两個地址,生成时應统一排序。
- 用随机數或時間戳做路径,每次發布都产生新地址,舊地址慢慢變成死鏈。
- 入口頁與目标頁域名混用,連結跳来跳去,蜘蛛在多個域之間往返,效率下降。
落地建议
- 先定一套命名規則:小寫、连字符、無多余參數、固定尾斜杠策略,寫進批量生成脚本里。
- 服務器配置 301 归一化,把已知的變体收敛到同一個規范地址。
- Sitemap 只提交規范地址,不要把带追踪參數的版本也提交進去。
- 日誌里按 URL 去重統計,看看是否存在大量“同一頁面不同地址”的抓取,有就說明归一化没做干净。
- 改版或換域名时,舊地址保留 301,不要直接删掉。
URL 本身不决定收錄,但它决定了蜘蛛愿意在你的内容上花多少時間。地址越干净,花在重复頁面上的時間就越少。
把 URL 当作基础设施来设計,而不是生成脚本的副产品。這件事不需要多高的技巧,需要的是定一次規范,然後在批量生产时坚持执行。