在讨论抓取频次、索引延迟这类问题时,服务器响应时间经常被跳过。但蜘蛛的每一次抓取,都要先等服务器把首字节吐出来。这一段等待看不见、摸不着,却实实在在地消耗着抓取资源。做站点运营的人未必需要懂后端,但至少要能判断:慢,是慢在哪里。
先分清是网络慢还是服务器慢
TTFB(首字节时间)里其实混了好几段:DNS 解析、TCP 连接、TLS 握手、服务端处理、首字节返回。只看一个总数容易误判。可以用 curl 的 -w 参数把各阶段拆开,或者在浏览器开发者工具的 Network 面板里看 Timing 分解。
更实用的一步是区分缓存命中和未命中。首页命中缓存时 30ms,未命中时 1.2s,这种差距说明问题在生成环节,而不是带宽。内容页也是同理,第一次请求和第二次请求的差异,往往比平均值更有信息量。
响应时间怎么影响抓取
抓取预算可以粗略理解为时间与并发资源的组合。同一个域名下,蜘蛛能保持的连接数有限。如果每个请求要等两秒才拿到响应,单位时间内能完成的抓取数量就少;反之,响应快,同样的时间窗口里就能多走几个 URL。
把响应时间当作抓取路上的重力:它不一定会让你掉下去,但会让每一步都更重一些。
需要说明的是,慢并不会直接导致页面不被收录,它更多是拉长从发现 URL 到实际抓取之间的间隔。对新站或者更新频繁的站点,这个间隔会被放大。
几个值得盯住的观测点
- 首页、栏目页、内容页各取一批 URL,分别看 TTFB 的中位数和 P95,不要只看平均值。
- 在服务端日志里按蜘蛛 UA 过滤,看这些请求的响应时间分布,而不是看全站平均。
- 统计超时与 5xx 的比例,尤其注意是否有集中出现的时段。
- 确认抓取高峰是否恰好撞上站点的定时任务、备份或数据同步。
这几项做完,基本能判断是常态偏慢,还是某个时间段被拖垮。
常见的拖慢原因
- 查询没有走索引:列表页、搜索页、相关推荐很容易触发全表扫描,页面越复杂越明显。
- 同步调用外部接口:模板里直接请求第三方接口取推荐、评论、天气,对方慢一秒,你的页面就慢一秒。
- 每页都做重活:全站统计、写日志到同一个文件、每次都重建缓存,这些操作放在请求链路里代价很高。
- 缓存键设计不当:把会话 ID、来源参数、时间戳带进缓存键,命中率会被压得很低,等于没有缓存。
调整顺序建议
- 先测量再动手。没有基线数据的优化,改完也不知道有没有效果。
- 优先补缓存,从首页、栏目页、热门内容页开始,逐层向下。
- 把外部调用改成异步或加超时降级,接口挂了也不该拖住整页。
- 给服务端处理设一个上限,超过就返回简化结果,而不是让请求一直挂着。
- 把响应时间纳入日常监控,出现异常时能定位到具体页面类型。
别为蜘蛛单独开一条通道
有人会给蜘蛛 UA 返回一个简化版页面,或者跳过某些耗时逻辑。这种做法要谨慎:一方面容易造成蜘蛛看到的内容与用户看到的不一致,另一方面也很容易被判定为作弊。更稳妥的思路是整体提速,让正常链路本身就足够快。
响应时间属于站点运营的基础项,不需要追求极致,但要保证绝大多数请求落在一个稳定、可预期的区间里。稳定比偶尔飞快更重要,因为蜘蛛看到的是长期的、平均的表现。