在蜘蛛池里,入口页的 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 当作基础设施来设计,而不是生成脚本的副产品。这件事不需要多高的技巧,需要的是定一次规范,然后在批量生产时坚持执行。