蜘蛛在一个站点里走动,靠的是页面上的链接。如果链接的指向关系里存在循环——A 页指向 B 页,B 页又指回 A 页,而且这种往返在多组页面之间重复出现——蜘蛛就会在同一个圈里反复进出。它不会报错,也不会停下,只是把时间花在了已经抓过的地址上。
循环是怎么形成的
大多数循环不是刻意做出来的,而是内容结构自然生长的结果。当一个页面同时承担导航、聚合、推荐三种角色时,它指向的地址往往和上级页面指向的地址高度重合。
- 分类与子分类互链:父分类列出子分类,子分类又用「上级分类」链接回到父分类,再叠加「相关分类」,形成多条来回路径。
- 分页首尾互指:第 1 页放了「最后一页」,最后一页又放了「第 1 页」,中间每一页都带全量页码,路径数量随页数迅速放大。
- 标签页与内容页互链:文章列出所属标签,标签页又列出全部文章,循环随着文章数量增加而变密。
- 筛选与排序参数:同一批内容被不同参数组合反复串起来,产生大量指向相同地址的入口。
- 导航、面包屑、相关阅读重叠:三处入口指向同一批 URL,蜘蛛每到一个页面都要重新筛选一遍。
为什么循环会被放大
单看一个页面,多几个链接没什么。但蜘蛛是按路径走的,任何一条新路径都会和其它路径重新组合。页面 A 有 50 个出口,其中 20 个又各自有 50 个出口,可走的路线数量是乘法关系,而其中真正没被抓过的地址可能只有几个。循环的代价不在于慢一次,而在于重复。
判断一段链接结构好不好,不看它指向了多少页面,而看它把蜘蛛引向了多少新页面。
怎么判断站里有多余的循环
不用复杂的工具,先看两个地方:一是服务器日志中同一批 URL 被反复请求的频次,尤其是那些内容几乎不变的列表页;二是 Sitemap 和实际内链的对比,如果一份地址清单里的页面明明有内链支撑,却仍然被反复抓取且长期没有变化,那多半是路径设计的问题,而不是蜘蛛「偏爱」这些页面。
收口的几种做法
- 面包屑只保留层级关系:首页 → 分类 → 子分类 → 详情,不再额外追加同级跳转或「相关分类」。
- 分页不做全量互连:保留上一页、下一页和首尾跳转即可,页码列表可以按区间折叠,不必让每一页都指向所有页码。
- 给标签和聚合页设门槛:内容量过少的标签页不要输出到全站导航,也不要在文章底部无差别展开。
- 参数地址单独收口:排序、筛选类参数用统一的规范地址承接,避免同一批内容出现多个入口。
- 相关阅读限量:模块内控制在固定条数,并尽量与导航、标签列表指向的地址错开,减少完全重叠的出口。
- 用 Sitemap 补深层页面:把重要但不适合放在导航里的页面写进地址清单,让蜘蛛从入口直接到达,而不是靠一圈圈翻页。
收口时要留意的反作用
删链接比加链接更容易出问题。有些页面唯一的入链就是那条「多余」的互链,一旦去掉,它就成了孤岛。收口之前先确认目标页面还有没有别的入口,尤其是较老的详情页、专题页和地区页。必要时用 Sitemap 或一处稳定的列表入口替上,再断开循环链接。
结语
抓取路径的设计目标很简单:让蜘蛛每走一步,都更接近一个它还没看过的地址。循环不是错误,只是没有产出的往返。把往返压下来,新内容的发现速度通常会跟着改善。