入口頁的 URL 是蜘蛛接触到的第一手信息,它影响抓取路径、去重判断,也决定你後面看日誌时能不能快速归類。URL 结构算不上什么玄学,更多是工程規范問题:定得早、定得稳,後面省很多事;定得乱,日誌會變成一团浆糊。
层級與深度:扁平一些,但不必全平铺
蜘蛛沿着連結逐层展開,路径越深,從入口頁爬到目标頁需要经過的跳數越多,抓取预算被消耗在中間环节的概率也越大。實践中把入口頁放在两到三层之内比較省心,例如 /p/192837.html 或 /list/192837.html 這類形式。
也不必把所有頁面都塞進根目錄。根目錄文件過多,會让部分服務器环境下的目錄操作、备份和人工排查變得麻烦,日誌按目錄聚合时也没有抓手。
- 列表頁到詳情頁,通常两层就够,不要再人為加中間层。
- 同一目錄下的文件數量控制在几千以内,便于按目錄抽样检查。
- 不要為了看起来有层次,造一串無意义的目錄名。
參數式還是伪静態:先看维護成本
?id=123 這類動態 URL 本身不會導致蜘蛛拒绝抓取,前提是參數值稳定、數量可控。真正麻烦的是無意义參數:跟踪參數、會话 ID、排序參數、随机數,它們會让同一個頁面裂變成几十個 URL,蜘蛛抓到的大多是重复内容。
伪静態 /123.html 的好處是日誌統計方便、CDN 缓存規則简單、看起来整齐;代價是要维護 rewrite 規則,而且容易和真實存在的静態文件路径打架。選擇哪種,取决于你的服務器环境和运维习惯。
决定抓取效率的是 URL 的唯一性與稳定性,不是结尾是 .html 還是带問号。
如果同一個頁面可以通過多種 URL 訪問,比如大小寫不同、带不带结尾斜杠、带不带 index.php,就選一個作為規范形式,其余的用 301 统一過去。
URL 里放什么、不放什么
- 可以放:稳定的數字 ID、短拼音或英文词,便于人工定位和對帳。
- 可以放:统一的前缀,比如 /z/ 或 /n/,方便在日誌里按目錄篩選。
- 不建议放:時間戳、随机串、無意义的長哈希,排查时基本没法對應到具体頁面。
- 不建议放:大段中文或關鍵詞堆砌,這類拼接對路径判断没有帮助,反而增加编碼出错的概率。
- 需要留意:如果入口頁與目标站做了隔离,URL 命名习惯最好也別完全一致。
批量變更 URL 的代價
入口頁一旦被抓取過,改 URL 近似于換了一個新頁面,原有的抓取记錄需要時間重新匹配。批量改 URL 常见的结果是:舊地址繼續被訪問並返回 404,新地址還没被重新發現,一段時間内整体抓取量下滑。
确實需要變更时,把舊地址 301 到新地址,並保持足够長的時間,同时记錄變更日期,事後用日誌對比前後抓取量。不要在同一周里反复調整同一批頁面。
用日誌驗證结构是否合理
结构定完不是终点。看几天的蜘蛛訪問日誌,關注三件事:抓取的 URL 是否集中在少數几個模板上;404 與 301 的比例是否異常升高;同一内容的多個 URL 變体是否被反复抓取。如果變体抓取量明顯偏多,說明規范化還没做到位。
一份可以照做的清單
- 确定一個 URL 模板,寫進生成脚本,之後不要随意更改。
- 保證同一内容只有一個可訪問地址,其余 301。
- 路径深度控制在三层以内,避免深层目錄鏈。
- 剔除無意义參數,只保留必要的标识。
- 變更前先评估,變更後保留 301 並持續跟踪日誌。
這些做法不會直接带来什么神奇效果,它們的價值在于减少抓取浪費,让後續的排查和統計有據可依。