使用Scrapy + Splash能否获取页面的TTFB(首字节时间)?
Scrapy + Splash 实现TTFB(首字节时间)获取方案
完全可以通过Scrapy + Splash获取到和Chrome网络面板定义一致的首字节时间(TTFB),可满足服务端渲染页面的速度测量需求,具体实现方式如下:
- 核心原理:Splash内置的HAR(HTTP归档)记录功能会完整存储所有请求的时间线数据,其中主文档请求条目的
timings.wait字段就是标准定义的TTFB,即从请求发送到收到服务器返回第一个字节的时间差,和Chrome网络面板的TTFB数值对齐。
实现步骤
1. 编写Splash侧Lua脚本
在Lua脚本中开启HAR采集,提取主文档的TTFB字段返回,参考脚本如下:
function main(splash, args) -- 开启HAR数据采集 splash:har_enable() -- 跳转目标页面 assert(splash:go(args.url)) -- 等待页面基础加载完成,可根据实际场景调整等待逻辑 splash:wait(0.5) -- 读取HAR数据 local har = splash:har() -- 提取主文档请求的TTFB(无重定向场景取第一个条目即可,有重定向需遍历匹配最终请求URL) local main_request = har.entries[1] local ttfb = main_request.timings.wait -- 返回数据:页面HTML、TTFB、页面全加载时间 return { html = splash:html(), ttfb_ms = ttfb, full_load_time_ms = har.pages[1].pageTimings.onLoad } end
2. 编写Scrapy侧请求逻辑
通过SplashRequest调用上述Lua脚本,直接从返回结果中读取TTFB数值,参考代码如下:
import scrapy from scrapy_splash import SplashRequest # 直接把Lua脚本定义在这里即可 LUA_SCRIPT = """ 上述Lua脚本完整内容 """ class SSRPerformanceSpider(scrapy.Spider): name = "ssr_performance" # 替换为你要测试的服务端渲染页面地址 start_urls = ["https://example.com/ssr-page"] def start_requests(self): for url in self.start_urls: yield SplashRequest( url, callback=self.parse_performance, endpoint="execute", args={ "lua_source": LUA_SCRIPT, "timeout": 30, } ) def parse_performance(self, response): yield { "page_url": response.url, # 直接获取返回的TTFB,单位为毫秒 "ttfb_ms": response.data["ttfb_ms"], "full_page_load_time_ms": response.data["full_load_time_ms"], "page_html": response.data["html"] }
注意事项
- 如果目标页面存在3xx重定向,不要直接取
har.entries[1],需要遍历所有entries匹配最终页面URL对应的请求条目,再提取TTFB,避免拿到重定向请求的TTFB数据。 - TTFB的测量误差通常在10ms以内,完全满足服务端渲染速度的测量需求。
内容的提问来源于stack exchange,提问作者sleepless_in_seattle
相关产品推荐
相关产品推荐

