在做入口页(蜘蛛池里常说的“放链接的页面”)时,有人习惯在链接后面带上统计参数,或者用 #锚点 定位到页面某个位置。这类链接被搜索蜘蛛读到之后会被怎么处理,是很多站长关心的问题。答案要分两种情况看:查询参数和 URL 片段(fragment)的机制并不一样。
先分清“发现”和“抓取”
搜索蜘蛛解析入口页 HTML 时,会把 a 标签的 href 提取出来放进待抓取队列,这一步是 URL 发现。真正发出 HTTP 请求、拿到内容,才叫抓取。参数和锚点在这两步里的表现不同,影响也不一样。
带查询参数的链接:会被当成独立 URL
如果入口页里写的是 /article?id=123&utm_source=spider,搜索蜘蛛大概率会把整个字符串当作一个 URL 对待。也就是说:
- 它可能单独发起一次抓取请求;
- 同一个内容会因为参数不同,在抓取队列里出现多个条目;
- 只有当页面本身给出足够强的合并信号(比如 canonical 指向不带参数的版本)时,这些副本才可能被归并。
对入口页来说,这意味着输出大量带参数的链接,会消耗掉本来就不多的抓取配额,真正想被发现的目标 URL 反而可能被排在后面。
#锚点:一般不会产生新的抓取请求
URL 里的 # 后面部分叫片段标识符,浏览器不会把它发给服务器,搜索蜘蛛抓取时同样不会。所以入口页里写 /page#section2 和 /page#section5,对爬虫来说指向的都是同一个 /page,一般不会因为锚点不同而多抓一次。
例外是单页应用里常见的 hash 路由(类似 #!/detail/123)。这类写法把内容标识放在片段里,传统爬虫不一定能识别,现在多依赖渲染能力,能不能发现目标内容并不稳定。
对入口页的实际影响
- 参数链接会放大 URL 数量,稀释抓取预算;
- 同一目标被多个参数版本链接,可能被反复抓取,日志里看起来“抓了很多”,实际覆盖的新 URL 很少;
- 锚点链接不会帮忙发现新页面,只能影响页面内的跳转位置;
- 如果入口页链接的目标不在自己手里,你很难保证对方会加 canonical 来合并这些变体。
比较稳妥的做法
- 入口页输出的目标链接尽量用干净的、不带跟踪参数的 URL;
- 确实需要参数时,控制数量,别让一个目标对应几十个变体;
- 在自己能控制的站点上,对参数页加 canonical 或 robots 规则,减少重复;
- 锚点只用于页内导航,不要指望它能带来新的 URL 发现;
- 定期看抓取日志,观察参数型 URL 占比,占比过高就说明入口页写法需要收敛。
抓取配额是有限的。入口页每多输出一类没有实际意义的 URL 变体,就可能少抓一个真正需要被发现的页面。
总结一下:带查询参数的链接通常会被搜索蜘蛛当作独立 URL 处理,可能产生额外的抓取请求;而 #锚点一般不触发新的抓取,也不能用于发现新页面。设计入口页时,尽量让链接指向最终、干净的目标地址,比堆参数更有效。