做站点运营时经常遇到一种情况:某个页面已经写进 Sitemap,站内也有链接指向它,可等了几周,服务器日志里就是没有蜘蛛的访问记录。要弄清问题出在哪,先要把两件事分开:URL 被发现,和 URL 被抓取,是两个独立环节,卡点往往不在同一个地方。
先分清三种状态
把「蜘蛛没来」笼统当成一个问题,排查方向很容易跑偏。实际至少有三类状态:
- 已发现、未抓取:蜘蛛知道这个地址存在,但还没排到它,或者不打算优先排它。
- 已抓取、未收录:页面已经被取走,只是后续判断不适合展示。这一环的问题要到内容质量和重复度上找。
- 抓取失败:蜘蛛来过,但拿到的是超时、5xx 或反复重定向,取页没有完成。
三者的处理方式完全不同。判断时优先看日志里有没有访问记录,有记录就说明问题不在发现环节。
URL 通常是被谁发现的
常见的发现通道有几条,节奏差别不小:
- Sitemap:属于主动告知,但告知不等于立刻排队,它更多是给蜘蛛一份可对照的清单。
- 站内链接:持续、可重复的发现方式。放在首页或栏目近期列表里的链接,通常会被反复走到。
- 外链与转载:不由自己控制,速度快慢看对方站点的抓取频率。
- 重定向与已抓页面的解析:蜘蛛在取一个页面时,会顺便解析其中的链接,相当于沿着已有路径向外扩展。
如果一条 URL 只出现在 Sitemap 里,站内没有任何入口指向它,它的发现时间就会明显拉长,抓取优先级也偏低。
发现之后为什么迟迟不来
抓取资源有限,站点之间也在排队
蜘蛛每次到访能取多少页面是有上限的,站点整体被信任的程度、历史抓取的顺利程度都会影响这个上限。新站或者长期响应不稳定的站,排队会更靠后。
抓取额度被低价值 URL 占用
参数组合页、筛选结果页、内容几乎相同的分页副本,这些地址如果可以被自由抓取,会消耗掉相当一部分抓取次数。留在队列里的真正需要抓取的 URL,就要往后排。
服务器响应拖慢整批抓取
单次响应时间过长、间歇性 5xx、连接超时,都会让蜘蛛提前结束这一轮抓取。表面看是「没来」,实际是来过但没取完。
一套可执行的排查顺序
- 在搜索后台的抓取统计里,按状态把待处理的 URL 分类,先确认它们属于「已发现未抓取」还是「抓取异常」。
- 翻服务器日志,看这些地址有没有被访问过,返回码是什么。这一步能快速排除一半的猜测。
- 对照 Sitemap:地址是否在其中、状态码是否为 200、lastmod 是否与页面实际更新时间一致。
- 从首页出发数一数到目标页需要几跳。跳数太深、只靠边栏深处的链接抵达,抓取频率会明显降低。
- 统计目标页所在目录的平均响应时间和错误率,确认是否有整段时间的异常。
日常维护里的几个习惯
- 新页面除了写进 Sitemap,也给一个稳定的站内入口,例如栏目近期列表或相关推荐。
- 定期检查 Sitemap,把已删除、已合并的地址清理掉,避免清单里长期挂着无效 URL。
- 对筛选、排序、会话类参数做规范化处理,减少同一内容产生多个地址。
- 关注服务器错误率的趋势,而非某一次波动,异常持续存在才值得动手。
抓取覆盖情况的改善是渐进的。调整结构、清理无效地址、优化响应速度之后,通常要观察一段时间才能看出趋势变化,不必因为一两天没有动静就反复改动。
把「发现」和「抓取」分开看之后,大部分困惑会变得可定位:是入口不够,是队列太长,还是服务器没接住。先确认卡在哪一环,再决定改什么,比反复提交地址更有效。