搜索抓取

蜘蛛反复抓同一批 URL:抓取冗余的成因与收敛思路

蜘蛛每天来,抓的还是那几十个地址,新页面却迟迟没人看——这往往不是抓取量不够,而是抓取冗余。本文拆解参数变体、canonical 缺失、时间戳信号、空壳页等常见成因,并给出从日志验证到逐步收敛的实操思路。

搜索抓取

蜘蛛反复抓同一批 URL:抓取冗余的成因与收敛思路

后台日志里常能看到一种现象:蜘蛛每天都来,抓的却是同一批地址,翻来覆去,响应码清一色 200 或 304,新上线的页面反而隔很久才被碰一次。很多人第一反应是“抓取量不够”,于是去提交、去发外链,结果抓取总量上去了,冗余也跟着上去了。真正要处理的,往往不是量的问题,而是重复。

先分清两种重复

抓取冗余大致分两类。一类是同一份内容有多个可访问地址,蜘蛛挨个抓;另一类是同一个地址被反复抓,但内容根本没变。前者浪费的是发现新 URL 的机会,后者浪费的是单次请求的时间。两类问题的处理方式不一样,先看日志里哪种占比更高,再决定从哪下手。

常见的几种成因

参数与变体地址

筛选、排序、追踪、会话参数是重灾区。同一个列表页因为 ?sort=、?from=、?utm_ 派生出成百上千个地址,页面主体却几乎一样。如果这些地址都能返回 200,蜘蛛就会把它们当成独立页面排队。除此之外,大小写混用、结尾斜杠忽有忽无、带不带 index 后缀,也会各自算作一个地址。

canonical 缺失或自相矛盾

页面没有声明主版本,或者 A 页指向 B、B 页又指回 A,蜘蛛就无法确认该保留哪一个。它不会“猜”,只会继续把几个版本都抓下去。内链里如果同时混用多个版本,等于在反复告诉蜘蛛“这几个都重要”。

频繁变动的时间信号

有些站点每次请求都动态生成当前时间戳,或者 Sitemap 里的 lastmod 天天刷新,但正文一个字没改。蜘蛛看到“刚更新过”的信号,自然会再来一趟。次数多了,它对这个信号的信任度也会下降。

空壳页与占位内容

栏目下暂时没有内容、搜索结果页、标签聚合页,如果都返回 200 加一句“暂无数据”,蜘蛛抓到的东西几乎没有价值,却仍会按正常页面安排回访。这类地址越多,真正需要抓取的页面分到的机会就越少。

收敛的几条主线

  • 统一内链写法。站内所有指向同一页面的链接,协议、域名、路径、斜杠、参数保持一致,别让蜘蛛从不同入口看到不同地址。
  • 明确主版本。每个可能重复的页面给一个自指向的 canonical,并确保它指向的地址能正常访问、内容一致。
  • 处理参数。无实际内容差异的参数,用 robots 规则拦掉抓取,或者在内链里彻底不带;有内容差异的,让它在页面上可被识别为独立页面。
  • 减少空壳。无内容的聚合页、搜索结果页,要么返回合适的 404 语义,要么直接不让蜘蛛进来。
  • 收紧提交范围。Sitemap 只放主版本和真正需要被发现的地址,别把参数变体一并写进去,否则等于自己制造冗余。

这些动作不需要一次全上。建议按“日志里出现次数最多的那一类”先改,改完观察一到两周,再决定下一步。

用日志确认是否真的收敛

做完调整,不要只看“抓取总量变没变”。更有用的几个指标是:同一路径下的不同查询串数量是否下降、蜘蛛对同一 URL 的重复抓取间隔是否拉长、304 与 200 的比例变化、以及新 URL 从上线到首次被抓的间隔是否缩短。这几个数据一起看,才能判断抓取是变“精”了还是只是变“少”了。

抓取冗余的排查,本质是回答一个问题:蜘蛛看到的地址数量,和站点真实需要的地址数量,差了多少。差距越小,留给新内容的抓取机会就越多。

最后提醒一点:冗余收敛是渐进过程。蜘蛛对站点结构的印象是长期积累的,改完内链和 canonical 之后,它可能还会按老习惯再抓一阵子。给这个过程留出观察周期,比频繁改动配置更有效。