搜索抓取

蜘蛛中途放弃一个 URL:超时、响应体与连接中断的排查角度

蜘蛛抓取并不是每次都能完整拿到页面。响应太慢、响应体过大、连接中途断开,都会让它提前收手,而日志里往往还显示 200。本文梳理这三类中断的触发条件和日志特征,并给出正文前置、缓存、连接复用与限速等可落地的调整思路,帮你判断蜘蛛到底抓到了什么。

搜索抓取

蜘蛛中途放弃一个 URL:超时、响应体与连接中断的排查角度

蜘蛛来抓一个页面,不等于它把页面完整拿走了。日志里状态码是 200、看起来一切正常,但如果响应时间太长、响应体太大或者连接中途断开,蜘蛛很可能只拿到一部分就放弃,后面的内容不会进入处理流程。下面从时间、体积和连接三个角度,说清楚蜘蛛在什么情况下会中途收手,以及站点侧能做什么。

一次抓取里三个容易被忽略的预算

时间预算:首字节和整体耗时

蜘蛛等待的是两段时间——服务器多久返回第一个字节(TTFB),以及整个响应多久结束。TTFB 长期偏高的目录,蜘蛛通常会降低回访意愿;整体耗时超过它的读取上限时,抓取会被中断,日志里可能只留下一个未完成的请求。

体积预算:响应体有读取上限

搜索引擎不会无限制地读取一个响应。超过一定大小的 HTML,后面的部分往往不会被继续处理。如果正文被大量模板代码、内联脚本、base64 图片挤到很靠后的位置,蜘蛛「看到」的内容可能并不是你希望它看到的那部分。

连接预算:同一连接上的连续请求

蜘蛛习惯在一个连接上连续请求多个 URL。如果服务器在连接复用上不稳定,或者中途主动断开,后续 URL 就要重新建连,抓取节奏会被整体拖慢。

蜘蛛中途放弃时,日志里长什么样

  • request_time 明显高于平时,但状态码仍是 200
  • body_bytes_sent 明显小于同类页面的平均水平,说明响应没发完
  • 499、连接重置、空响应,通常是客户端先断开
  • 同一时段请求集中在少数几个重页面,其他 URL 很少被访问

这些信号单独看都不够确定,放在一起看就比较清晰:如果一个页面的平均响应体积长期偏小、耗时又偏高,它大概率没被完整抓走。

容易触发中断的几类页面

  • 依赖实时接口渲染、又没有缓存的列表页与详情页
  • 单页 HTML 体积很大,正文却排在中后段
  • 图片以内联编码方式写进 HTML,把页面撑得很大
  • 首屏依赖大量外部资源的页面,服务端等待时间被拉长
  • 数据库慢查询直接暴露给前端的页面

站点侧可以做的调整

  1. 给动态页面加一层缓存,先把 TTFB 压下来,再谈抓取频次。
  2. 把正文尽量前置,模板导航、脚本放在正文之后或外链引入。
  3. 大页面拆分成分页或分章节,让每一页都在体积上限之内。
  4. 懒加载的内容要有可被普通请求拿到的链接或数据,不能只靠滚动触发。
  5. 检查连接复用配置,避免服务端在 keep-alive 下频繁主动断开。
  6. 对蜘蛛单独观察限速与并发,不要用统一的防护规则把它一起限制掉。

怎么确认蜘蛛是否抓全了

最直接的办法是把日志里的请求耗时和响应字节数与自己的抓取做对比:用相同的 User-Agent 请求同一个 URL,比较返回体积、状态码和耗时。如果线上响应明显更慢或更小,说明问题出在服务端而不是蜘蛛。也可以用命令行工具记录完整的响应头和响应体大小,作为排查的基线。

蜘蛛的放弃往往是静默的:状态码正常,内容却不完整。把响应时间、响应体积和连接稳定性当成抓取质量的三个指标来观察,比单纯盯回访次数更容易找到问题。