蜘蛛抓站的过程很像一次没有全局地图的巡检:它手里只有当前页面上的链接,走一步看一步。当站内链接关系出现环状结构,蜘蛛就会在几个页面之间来回折返,把同一批 URL 反复取回。这类折返不一定报错,日志里看起来也抓得很勤,但真正的新页面反而排不上队。
折返是怎么形成的
折返通常不是某一条链接的问题,而是几组链接组合出来的结果。
- 分页与列表互链:第 2 页链回第 1 页,第 1 页又链到第 2 页,翻页控件还带着上一页、下一页、首页、末页,蜘蛛很容易在头几页里绕圈。
- 标签与聚合页:标签页之间互相推荐,聚合页又把标签页列出来,形成一个小型闭环。
- 筛选参数:颜色、排序、每页数量等参数组合出大量 URL,它们指向的其实是同一批内容,却各自成为一条可抓取的入口。
- 面包屑与导航:多级导航层层回指,深处页面同时被导航、面包屑和正文链接指向同一个地址的不同写法。
日志里能看到的折返信号
把服务器日志按 UA 过滤出蜘蛛请求后,可以重点看几件事:
- 同一路径在单位时间内出现的次数,尤其是带参数的变体。
- 抓取时间间隔是否越来越短,说明蜘蛛认为这里有新内容。
- referer 字段是否总在同一小圈页面之间跳。
- 状态码分布里 200 占比很高,但唯一 URL 数的增长却明显偏慢。
抓取次数多,不等于抓取面广。前者是量,后者才是覆盖。
折返带来的代价
蜘蛛的抓取资源是有限的。当它把时间花在重复路径上,新 URL、刚刚更新过的页面、需要重访的老页面都会被推迟。更麻烦的是,如果这些折返路径还带上了动态参数,抓回来的可能只是同一份内容的多个副本,后续还得靠规范化去收拾。
把路径收拢的几种做法
- 先定主路径:每个内容页面选一个规范地址,其余变体用 canonical 指回主路径,内链也只指向主路径。
- 弱化翻页回指:分页序列保留下一页即可,回到首页、末页的链接并非必须。
- 参数入口收口:排序、筛选这类参数页面,如果不打算让它们参与抓取,就在 robots 里挡住或加上 nofollow,避免它们成为折返节点。
- Sitemap 只放主线:把最重要的页面放进 Sitemap,让它成为一条不绕行的入口,而不是把所有变体都塞进去。
- 检查内链的指向写法:www 与非 www、带斜杠与不带斜杠、大小写差异,都会让同一个页面在蜘蛛眼里变成两条路。
服务器层面配合什么
路径收拢之后,还要保证蜘蛛走到每个地址时能稳定拿到响应。响应时间忽长忽短、偶尔超时或返回 5xx,都会让蜘蛛放慢回访,间接拉长整站被重新巡检的周期。日志里如果发现折返和超时集中在同一时段,可以先看那个时段的资源占用情况。
折返本身不是故障,它更像是站内链接结构写出来的一条默认路线。定期从日志里翻一翻这条路线,把不必要的小圈拆掉,蜘蛛的每一次往返才更接近你想要覆盖的页面。