这个问题常被混成一件事来问,其实要拆成两层:第一层,搜索蜘蛛把这两个链接当成同一个 URL 还是两个 URL;第二层,它会不会因此多抓或少抓。两层的答案并不一致,需要分开看。
锚点(# 后面的部分)一般不参与 URL 标识
按 URL 规范,井号及其后面的片段标识符不会发送给服务器,服务器永远只看到井号之前的部分。因此:
- 同一个页面里写 /a.html 和 /a.html#top,对搜索蜘蛛来说通常视为同一个地址,不会因为锚点不同而各抓一次。
- 早期对 #! 这类 hash 路由有特殊处理,但现在主流做法是直接渲染 JavaScript,不要再指望靠这种写法做 URL 发现。
- 如果入口页靠锚点区分不同目标内容,搜索蜘蛛抓到的仍然只是同一个 URL 返回的内容,锚点带来的差异不会被单独抓取。
查询参数会参与 URL 标识,但不一定带来更多抓取
?id=1 和 ?id=2 在字符串层面是两个不同的 URL,搜索蜘蛛在发现阶段确实会把它们分别记录下来。但接下来会发生什么,取决于内容是否真的不同:
- 参数不同、内容确实不同:一般是两个独立页面,各自按自身价值获取抓取。
- 参数不同、内容基本相同(例如只是排序、来源追踪):容易被视为重复,通常只保留一个代表地址,其余地址的抓取频率明显下降。
- 参数组合爆炸(如 ?a=1&b=2&c=3 的各种排列):抓取预算被大量消耗在相似 URL 上,真正想被发现的目标可能反而排在后面。
参数顺序和写法上的小差别
?a=1&b=2 与 ?b=2&a=1 在字符串上是不同 URL,但很多站点返回的是同一份内容。这类写法如果在入口页里混用,等于人为制造重复地址。类似的情况还有大小写不一致、中文参数是否编码、末尾斜杠有无、http 与 https 混写。
另一个容易被忽略的点是,入口页里有时把带参数的链接写成相对地址,不同页面解析出的绝对地址可能不同,最终产生的 URL 数量会比预想的多。
对抓取节奏的实际影响
入口页的链接数量、站点整体的抓取历史表现、目标 URL 的响应速度,都会影响搜索蜘蛛在这里停留多久。同一批地址重复出现、参数变体过多,等于在有限的抓取窗口里塞进大量低价值链接。常见的现象是:入口页被访问了,但真正被抓到的目标 URL 数量远少于页面上的链接数。
不要指望靠多写几个参数变体就能让搜索蜘蛛多抓目标内容。参数变体通常只会稀释抓取,而不是放大。
排查时可以按这个顺序做
- 从入口页源码里把链接完整抓一遍,用绝对地址列出并去重,看是否存在同一目标的多份变体。
- 检查是否把锚点当成不同目标使用;如果有,改成不同路径或不同页面。
- 清理仅用于统计、排序、来源追踪的参数,避免它们出现在入口页的目标链接中。
- 统一协议、域名、大小写、末尾斜杠的写法,让同一个目标只对应一个地址。
- 确认目标 URL 本身响应正常、返回 200,再谈是否被抓;参数再干净,目标地址返回 5xx 也抓不下去。
- 在服务器日志里对比入口页的蜘蛛访问次数与目标 URL 的抓取条数,判断问题出在发现环节还是抓取环节。
小结
锚点通常不构成新的 URL,查询参数会构成新的 URL,但新 URL 不等于会获得抓取。入口页真正该做的是让每个目标对应一个干净的地址,而不是靠参数堆出看起来更多的链接。