URL 是蜘蛛进入站点的第一条线索
蜘蛛抓到一条链接时,第一件事是把 URL 拆成主机、路径、参数,再判断这页值不值得排队。URL 写得规整,解析成本低,去重也容易;写得乱,同一份内容可能被拆成好几条待抓地址,抓取预算就这样被吃掉。
目录层级:入口页该放多深
入口页建议控制在一到两层,例如 /a/xxx.html 或 /topic/xxx.html。层级过深,比如 /a/b/c/d/2024/03/xxx.html,不是不能抓,而是蜘蛛在分配预算时通常会先照顾浅层页面,深处的地址排到队尾,等到的机会被拉长。
但也不要为了扁平,把几百个入口页全塞进根目录,形成一条极长的首页链接列表。蜘蛛顺着首页爬,很快就不愿再往下点。折中做法是:一级目录做分类,二级目录放具体页面。
参数:能不用就别堆
?id=123&from=list&spm=abc 这类参数对用户没意义,对蜘蛛却是实打实的分叉。同一页因为参数不同产生五个版本,蜘蛛会当成五条地址分别排队。如果必须保留参数,可以这样处理:
- 只保留有实际内容的参数,跟踪类参数在入口页链接里尽量不出现
- 分页优先用 /list/2/ 这样的路径,而不是 ?page=2,歧义更少
- 不要用参数做跳转中转,蜘蛛跟丢了也拿不到内容
结尾斜杠与大小写:同一页的两种写法
/a/1 与 /a/1/ 在很多服务器上是同一个页面,但在蜘蛛眼里是两条 URL。如果站点没有做 301 统一,两条都可能被排进队列。大小写同理,Linux 环境下 /Page 和 /page 是两个资源。
做法很朴素:生成链接时统一规则(带不带斜杠、是否全小写),服务器端对另一种写法返回 301,指向规范版本。canonical 是补充手段,不是替代方案。
字符与长度:别让 URL 变成乱码
中文路径、空格、括号、& 等符号在传输中容易被转义。转义本身没问题,但转义后长度翻倍,日志里也难读。入口页 URL 建议用短横线连接英文或拼音,控制长度,避免出现 %E4%B8%AD 这样的大段长串。
另外,URL 里不要放会变的字段,比如时间戳、随机数、会话 ID。蜘蛛今天抓到的地址,明天就失效,等于白跑一趟,还占用了配额。
绝对链接与相对链接:给蜘蛛省一步
相对链接(./xxx.html、../xxx.html)需要蜘蛛基于当前页地址拼接,多数情况下没问题,但在重定向、末尾斜杠不一致的页面上,拼接结果容易偏。入口页之间的互链建议用完整绝对地址,减少拼接歧义,也方便自己排查。
一份可执行的检查清单
- 入口页是否都在一到两层目录内,路径可读
- 是否存在带跟踪参数的入口页链接
- 斜杠与大小写是否有 301 统一
- URL 中是否含会话 ID、时间戳、随机数
- sitemap 与页面内链接的 URL 写法是否完全一致
URL 不是装饰。它是蜘蛛理解站点结构的地图,地图画得清楚,后续的抓取、去重和更新判断都会省力。
把 URL 规则先定下来,再回头看入口页数量、更新频率这些话题,很多重复抓取的问题会自然减少。先统一规则,再谈铺量,顺序反了,后面要花更多时间收拾。