很多人把“URL 被发现”当成“URL 会被抓”的同义词,于是在 sitemap 里加了一批地址、在页面上挂了几条内链,就开始盯日志。结果发现日志里迟迟没有动静,或者出现的时间比预想的晚很多。这中间的差距,通常不是蜘蛛没看见,而是 URL 已经排进了抓取队列,只是还没轮到。
发现和抓取之间隔着一条队列
蜘蛛的工作大致可以拆成几步:发现 URL、把 URL 放进待抓队列、按某种顺序取出并请求、解析结果、再把新链接放回队列。发现只是第一步。真正决定“什么时候抓”的,是队列的排序和取出速度。
这条队列并不针对某一个站,而是所有已知 URL 混在一起调度。所以一个站点能否很快被抓,既取决于自己 URL 的重要程度,也取决于蜘蛛当时整体的负载。
队列不是先进先出
如果按提交时间排队,蜘蛛会很快陷入低价值页面的泥潭。实际调度里通常有几层考虑:
- 主机级限流:同一个域名下的请求会被限制并发数和频率,避免把站点打垮。站点越大、响应越慢,单位时间内能取走的 URL 就越少。
- 页面优先级:被内链频繁指向、靠近首页、有明显更新的 URL,一般会排在前面。
- 重访调度:已经抓过的页面会按更新频率安排下次访问,这部分会持续占用队列额度。
这三件事叠加起来,就解释了为什么同样一条内链,放在首页导航和放在第五层目录里,被抓的时间可能差很多。
队列积压时,你会看到什么
- 新 URL 在日志里出现得越来越晚,明明发布了几天,第一次抓取还在等。
- 老页面的重访间隔被拉长,明明改过内容,也没有很快回来。
- 深层页面、参数页、分页尾部的 URL 基本不动。
- 站点响应变慢或频繁返回 5xx 时,抓取量整体下降,恢复后也要过一段时间才回到原来水平。
这些现象都不是“蜘蛛不来了”,而是队列在正常消化,只是被消化的是别的 URL。
让重要 URL 少排队,可以做几件事
- 减少低价值 URL 的数量:筛选参数、排序参数、重复的列表页,能规范就规范,能屏蔽就屏蔽。队列额度是有限的,少一半无效 URL,等于给有效 URL 腾出空间。
- 把响应时间压下来:同一个主机限流下,响应快意味着单位时间能抓更多。首字节时间、数据库查询、外部接口调用,都是可以下手的地方。
- 保证状态码稳定:频繁的超时、连接中断、5xx 会让蜘蛛降低对该主机的抓取强度,恢复需要时间。
- 用内链把重要页面放在近处:首页、栏目页、相关推荐里给出链接,比埋在多层目录里更有效。
- 把 sitemap 当成补充:它能告诉蜘蛛有哪些 URL,但不改变队列的排队规则,也不保证优先被抓。
怎么观察等待时间
日志里可以关注几个点:新 URL 从第一次被外部引用到第一次被蜘蛛请求之间隔了多久;同一批 URL 的抓取时间是否越来越分散;站点响应变慢的那几天,抓取条数有没有同步下降。把这些时间点对齐,往往能看出问题出在发布节奏、站点性能还是链接结构。
队列的排序规则不公开,也不承诺任何 URL 一定在某个时间内被抓。把可观察的环节做好——响应稳定、结构清晰、低价值 URL 少——比盯着某一条链接等日志更实际。