常见问题

入口页链接带跟踪参数或 # 锚点:搜索蜘蛛会当成两个 URL 重复抓取吗

入口页链接一旦带上 utm_source 之类的跟踪参数,或者加上 # 锚点,URL 字符串就变了样。本文说明搜索蜘蛛对查询参数的通常处理方式、锚点为什么不会额外产生请求,以及蜘蛛池入口页在输出链接、使用 canonical 和用日志验证时该注意什么。

常见问题

入口页链接带跟踪参数或 # 锚点:搜索蜘蛛会当成两个 URL 重复抓取吗

在蜘蛛池入口页上放链接时,一个很常见的小动作是给链接加上各种尾巴:?utm_source=xxx、?from=spider,或者干脆加个 #anchor。表面上只是“标记一下来源”,但对搜索蜘蛛来说,这些尾巴意味着 URL 字符串已经变了。下面把两种情况分开说清楚。

一、查询参数:算不同的 URL

URL 里问号后面的部分属于查询参数。对搜索蜘蛛而言,带参数的地址和不带参数的地址在字符串层面就是两个地址,服务器收到的也是两条请求。比如入口页同时出现这两个链接:

  • /article/100
  • /article/100?utm_source=zhizhu

它们会被当作两个不同的 URL 去请求。如果入口页里几千个链接全都加上互不相同的参数,等于把目标 URL 复制成了几千份,抓取量被分散,而最终能正常参与展示的往往只有其中一个版本。

哪些参数值得留意

  • 跟踪类:utm_source、utm_medium、gclid、fbclid、ref、from,对页面内容没有影响,纯属标记。
  • 会话类:sessionid、sid、phpsessid,同一个页面每个访客一个地址,重复度极高。
  • 功能类:page、sort、filter、lang,可能改变页面内容,属于有意义但也有风险的一类。

处理方式通常有三种:入口页直出干净链接;确需带参数时,在目标页用 canonical 指明主版本;或者在 robots.txt、站长平台的参数处理工具里声明不抓某些参数。

二、# 锚点:通常不算独立 URL

井号后面的片段在 HTTP 请求里根本不会发给服务器,搜索蜘蛛请求的仍然是去掉锚点的那段地址。所以:

  • 入口页里的 /page#section1 和 /page#section2,对蜘蛛来说只对应一个请求地址 /page。
  • 锚点不会额外产生抓取请求,也不用担心它把抓取预算摊薄。
  • 例外是纯前端路由:如果站点用 #/list/123 这种 hash 路由,服务端收到的永远是同一个入口地址,能否被识别取决于前端渲染方式,这类结构本身不利于 URL 发现。

三、蜘蛛池入口页的实操建议

  1. 入口页输出的链接尽量是最终形态的干净 URL,不要为了统计方便批量加参数。
  2. 统计需求交给服务端日志或落地页自己的埋点,不一定要改写链接。
  3. 如果历史链接已经带了参数,先看日志里带参数版本的请求量,再判断是否值得保留。
  4. 对同一内容的多版本地址,用 canonical 收口,让权重集中到主版本。
  5. 定期在日志里看同一路径出现了多少种 URL 变体,变体突然增多,通常意味着某处批量加了参数。
参数和锚点都不是“越多越好”。参数会制造重复地址、消耗抓取预算,锚点则基本不增加请求。入口页要做的,是把有限的可抓次数花在真正需要被发现的地址上。

四、怎么验证有没有被当成两个地址

最简单的方法是看服务器日志:把同一个路径的访问记录按“去掉参数”的版本分组,对比请求数、蜘蛛 IP 分布和时间段。如果带参数版本的请求数几乎和不带参数版本一样多,说明蜘蛛确实把两者都抓了一遍;如果只有零星几条,说明它已经做了归一化处理。两种结果都不必紧张,关键是别让参数版本的数量持续膨胀。

总结一句:查询参数会生成新的 URL 字符串,可能带来重复抓取;锚点通常不会。设计蜘蛛池入口页时把链接写干净,比事后用各种规则补救要省事得多。