Python + HAR 生成页面性能测试报告

Python + HAR 一键生成页面性能测试报告

通过Python解析HAR文件并自动生成可视化的页面性能测试报告,下面提供一套完整、可直接落地的实现方案,涵盖HAR解析、性能指标提取、HTML报告生成全流程。

一、方案概述

  1. HAR文件说明:HAR(HTTP Archive)是一种JSON格式的文件,用于记录浏览器与服务器之间的HTTP请求/响应详情及页面加载性能数据,可通过Chrome、Firefox等浏览器的开发者工具获取。
  2. 核心依赖库
    • haralyzer:专门用于解析HAR文件,提取性能指标和请求数据,简化手动解析JSON的复杂度。
    • jinja2:轻量级模板引擎,用于快速渲染HTML报告,支持自定义报告样式和结构。
    • json:Python内置库,辅助读取和解析HAR文件(haralyzer底层也依赖此库)。
  3. 实现流程:获取HAR文件 → Python解析HAR → 提取关键性能指标 → 渲染HTML模板 → 生成可视化报告。

二、环境准备

先安装所需依赖库,执行以下命令:

pip install haralyzer jinja2 

三、关键步骤实现

步骤1:获取HAR文件(浏览器操作)

以Chrome浏览器为例,获取页面HAR文件:

  1. 打开Chrome浏览器,访问需要测试的页面。
  2. F12 打开开发者工具,切换到 Network 面板。
  3. 勾选面板左上角的 Preserve log(保留日志)。
  4. 刷新页面(或重新加载目标页面),等待所有请求加载完成。
  5. 右键点击 Network 面板中的任意请求,选择 Save all as HAR with content,保存为 .har 格式文件(如 page_perf.har)。

步骤2:Python解析HAR文件并提取性能指标

编写Python脚本,解析HAR文件,提取核心页面性能指标(如页面加载时间、DNS查询时间、TTFB等)和请求详情。

import json from haralyzer import HarParser, HarPage from datetime import datetime defparse_har_file(har_file_path):""" 解析HAR文件,提取页面性能指标和请求数据 :param har_file_path: HAR文件路径 :return: 性能指标字典 + 详细请求列表 """# 读取HAR文件try:withopen(har_file_path,'r', encoding='utf-8')as f: har_data = json.load(f)except FileNotFoundError:raise Exception(f"错误:未找到HAR文件 {har_file_path}")except json.JSONDecodeError:raise Exception(f"错误:{har_file_path} 不是合法的JSON格式HAR文件")# 初始化HAR解析器 har_parser = HarParser(har_data)# 获取页面信息(若HAR包含多个页面,取第一个页面) har_pages = har_parser.pages ifnot har_pages:raise Exception("错误:HAR文件中未包含页面性能数据") target_page: HarPage = har_pages[0]# 提取核心性能指标(单位:毫秒) perf_metrics ={"页面名称": target_page.page_title or"未命名页面","测试时间": datetime.fromtimestamp(int(target_page.start_time.timestamp())).strftime("%Y-%m-%d %H:%M:%S"),"页面加载总时间":round(target_page.page_load_time,2),# 页面完全加载时间"DNS查询总时间":round(target_page.dns_time,2),# DNS解析总耗时"TCP连接总时间":round(target_page.tcp_time,2),# TCP三次握手总耗时"首字节时间(TTFB)":round(target_page.ttfb,2),# 服务器响应首字节时间"请求发送时间":round(target_page.send_time,2),# 请求数据发送耗时"响应接收时间":round(target_page.receive_time,2),# 响应数据接收耗时"资源加载总时间":round(target_page.ssl_time + target_page.send_time + target_page.receive_time,2),"总请求数":len(target_page.requests),# 页面总请求数量"失败请求数":len([req for req in target_page.requests if req.status_code >=400]),# 错误请求数"静态资源数(JS/CSS/图片)":len([req for req in target_page.requests if req.resource_type in["script","stylesheet","image"]])}# 提取详细请求列表 request_details =[]for req in target_page.requests: request_info ={"请求URL": req.url,"请求方法": req.method,"状态码": req.status_code,"资源类型": req.resource_type or"unknown","请求耗时(ms)":round(req.time,2),"DNS耗时(ms)":round(req.dns_time,2),"TCP耗时(ms)":round(req.tcp_time,2),"TTFB(ms)":round(req.ttfb,2),"响应大小(B)": req.response_size or0} request_details.append(request_info)return perf_metrics, request_details 

步骤3:使用Jinja2渲染HTML报告模板

  1. 先创建HTML模板文件(命名为 perf_report_template.html),定义报告样式和结构:
<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><title>{{ perf_metrics.页面名称 }} - 性能测试报告</title><style>*{margin: 0;padding: 0;box-sizing: border-box;font-family:"Microsoft YaHei", sans-serif;}.container{width: 95%;margin: 20px auto;}.report-header{text-align: center;padding: 15px;background-color: #f5f5f5;border-radius: 5px;margin-bottom: 20px;}.metrics-card{background-color: #f8f9fa;padding: 20px;border-radius: 5px;margin-bottom: 20px;box-shadow: 0 2px 4px rgba(0,0,0,0.1);}.metrics-card h2{color: #2c3e50;margin-bottom: 15px;border-bottom: 2px solid #3498db;padding-bottom: 10px;}.metrics-table{width: 100%;border-collapse: collapse;margin-top: 10px;}.metrics-table th, .metrics-table td{border: 1px solid #ddd;padding: 12px;text-align: left;}.metrics-table th{background-color: #3498db;color: white;font-weight: bold;}.metrics-table tr:nth-child(even){background-color: #f2f2f2;}.warning{color: #e67e22;font-weight: bold;}.error{color: #e74c3c;font-weight: bold;}</style></head><body><divclass="container"><divclass="report-header"><h1>{{ perf_metrics.页面名称 }} - 页面性能测试报告</h1><p>生成时间:{{ generate_time }} | 测试时间:{{ perf_metrics.测试时间 }}</p></div><!-- 核心性能指标展示 --><divclass="metrics-card"><h2>一、核心性能指标</h2><tableclass="metrics-table"><thead><tr><th>性能指标</th><th>数值</th><th>单位</th><th>说明</th></tr></thead><tbody><tr><td>页面加载总时间</td><td>{{ perf_metrics.页面加载总时间 }}</td><td>毫秒(ms)</td><td>页面从开始加载到完全渲染完成的总耗时</td></tr><tr><td>DNS查询总时间</td><td>{{ perf_metrics.DNS查询总时间 }}</td><td>毫秒(ms)</td><td>域名解析的总耗时,越小表示解析越快</td></tr><tr><td>TCP连接总时间</td><td>{{ perf_metrics.TCP连接总时间 }}</td><td>毫秒(ms)</td><td>TCP三次握手的总耗时,反映网络连接效率</td></tr><tr><td>首字节时间(TTFB)</td><td>{{ perf_metrics.首字节时间(TTFB) }}</td><td>毫秒(ms)</td><td>从请求发送到接收服务器首个字节的时间,反映服务器响应速度</td></tr><tr><td>总请求数</td><td>{{ perf_metrics.总请求数 }}</td><td>个</td><td>页面加载的所有HTTP/HTTPS请求数量</td></tr><tr><td>失败请求数</td><tdclass="{% if perf_metrics.失败请求数 > 0 %}error{% endif %}"> {{ perf_metrics.失败请求数 }} </td><td>个</td><td>状态码≥400的异常请求数量,理想值为0</td></tr><tr><td>静态资源数(JS/CSS/图片)</td><td>{{ perf_metrics.静态资源数(JS/CSS/图片) }}</td><td>个</td><td>页面加载的核心静态资源数量</td></tr></tbody></table></div><!-- 详细请求列表展示 --><divclass="metrics-card"><h2>二、详细请求列表</h2><tableclass="metrics-table"><thead><tr><th>请求URL</th><th>请求方法</th><th>状态码</th><th>资源类型</th><th>请求耗时(ms)</th><th>DNS耗时(ms)</th><th>TCP耗时(ms)</th><th>TTFB(ms)</th><th>响应大小(B)</th></tr></thead><tbody> {% for req in request_details %} <tr><td>{{ req.请求URL }}</td><td>{{ req.请求方法 }}</td><tdclass="{% if req.状态码 >= 400 %}error{% endif %}">{{ req.状态码 }}</td><td>{{ req.资源类型 }}</td><td>{{ req.请求耗时(ms) }}</td><td>{{ req.DNS耗时(ms) }}</td><td>{{ req.TCP耗时(ms) }}</td><td>{{ req.TTFB(ms) }}</td><td>{{ req.响应大小(B) }}</td></tr> {% endfor %} </tbody></table></div></div></body></html>
  1. 编写Python脚本,加载模板并生成最终HTML报告:
from jinja2 import Environment, FileSystemLoader import os defgenerate_perf_report(har_file_path, output_report_path=None):""" 一键生成页面性能测试HTML报告 :param har_file_path: HAR文件路径 :param output_report_path: 输出报告路径(默认:当前目录 + 页面名称 + _perf_report.html) :return: 生成的报告路径 """# 1. 解析HAR文件 perf_metrics, request_details = parse_har_file(har_file_path)# 2. 配置Jinja2模板环境# 获取当前目录(模板文件需与脚本在同一目录) current_dir = os.path.dirname(os.path.abspath(__file__)) env = Environment(loader=FileSystemLoader(current_dir))# 加载HTML模板 template = env.get_template("perf_report_template.html")# 3. 准备模板渲染数据 render_data ={"perf_metrics": perf_metrics,"request_details": request_details,"generate_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")}# 4. 确定输出报告路径ifnot output_report_path: page_name = perf_metrics["页面名称"].replace("/","_").replace("\\","_").replace(":","_") output_report_path =f"{page_name}_perf_report.html"# 5. 渲染并生成HTML报告withopen(output_report_path,'w', encoding='utf-8')as f: f.write(template.render(render_data))return output_report_path # 主函数:一键执行if __name__ =="__main__":# 配置参数:HAR文件路径(替换为你的HAR文件路径) HAR_FILE_PATH ="page_perf.har"# 本地HAR文件# 可选:指定输出报告路径# OUTPUT_REPORT_PATH = "my_page_perf_report.html"try:# 生成报告 report_path = generate_perf_report(HAR_FILE_PATH)# report_path = generate_perf_report(HAR_FILE_PATH, OUTPUT_REPORT_PATH)print(f"成功!页面性能测试报告已生成:{os.path.abspath(report_path)}")except Exception as e:print(f"失败:{e}")

四、一键运行与使用

1. 文件目录结构

确保文件摆放如下:

├── page_perf.har # 你从浏览器导出的HAR文件 ├── perf_report_template.html # HTML模板文件 └── har_perf_report.py # Python脚本文件 

2. 执行脚本

  1. 修改 har_perf_report.py 中的 HAR_FILE_PATH 为你的HAR文件名称(如 page_perf.har)。
  2. 执行成功后,当前目录会生成 .html 格式的性能报告(如 XXX_perf_report.html)。

在终端执行Python脚本:

python har_perf_report.py 

3. 查看报告

双击生成的HTML报告文件,用任意浏览器打开,即可查看:

  • 核心性能指标(页面加载时间、DNS/TCP耗时、TTFB等)。
  • 所有请求的详细信息(URL、状态码、耗时、资源类型等)。
  • 异常请求(状态码≥400)会用红色标注,便于快速排查问题。

五、报告关键指标解读

性能指标含义与优化方向
页面加载总时间页面完全加载耗时,越小越好;优化方向:减少资源体积、开启缓存、懒加载。
DNS查询时间域名解析耗时,优化方向:使用DNS缓存、选择优质DNS服务商、减少域名数量。
TCP连接时间TCP握手耗时,优化方向:使用HTTP/2/HTTP/3、开启TCP复用、缩短网络链路。
TTFB(首字节时间)服务器响应速度,优化方向:优化服务器接口、使用CDN、减少后端数据库查询耗时。
失败请求数异常请求数量,理想值为0;需排查4xx/5xx错误(如接口异常、资源不存在)。
总请求数请求数量越多,加载越慢;优化方向:资源合并(JS/CSS合并)、雪碧图、减少冗余请求。

六、扩展优化

  1. 支持多页面HAR:修改脚本,遍历 har_parser.pages,为每个页面生成独立报告。
  2. 增加性能阈值判断:在模板中添加阈值配置(如页面加载时间>3000ms标红警告)。
  3. 导出Excel报告:结合 pandas 库,将性能数据导出为Excel格式,方便批量统计。
  4. 添加图表可视化:在HTML模板中引入ECharts,生成请求耗时分布、资源类型占比等图表。

总结

  1. 核心流程:HAR文件获取(浏览器)→ Python解析(haralyzer)→ 指标提取 → Jinja2渲染HTML报告
  2. 关键依赖:haralyzer 简化HAR解析,jinja2 实现灵活的HTML报告定制。
  3. 一键使用:替换HAR文件路径,执行脚本即可生成可视化报告,快速排查页面性能瓶颈。

Read more

1Panel 安装与使用全指南:从部署到实战运维

1Panel 安装与使用全指南:从部署到实战运维

1Panel 安装与使用全指南:从部署到实战运维 1Panel 作为一款开源、现代化的 Linux 服务器运维管理面板,凭借容器化架构、简洁界面和丰富功能,成为替代传统面板的优选工具。本文将从安装准备、部署步骤、功能使用到进阶技巧,全方位带你掌握 1Panel 的实战运维能力。 一、1Panel 简介:为什么选择它? 1Panel 基于 Go 语言开发,采用 Docker 容器化技术,实现了服务器管理的「轻量化、低侵入、高安全」。核心优势包括: * 可视化运维:通过 Web 界面管理服务器资源、应用部署、域名 SSL 等,无需复杂命令; * 容器化隔离:所有应用运行在 Docker 容器中,避免环境冲突,降低运维风险; * 丰富生态:内置

By Ne0inhk
[特殊字符]颠覆MCP!Open WebUI新技术mcpo横空出世!支持ollama!轻松支持各种MCP Server!Cline+Claude3.7轻松开发论文检索MCP Server!

[特殊字符]颠覆MCP!Open WebUI新技术mcpo横空出世!支持ollama!轻松支持各种MCP Server!Cline+Claude3.7轻松开发论文检索MCP Server!

🔥🔥🔥本篇笔记所对应的视频:🚀颠覆MCP!Open WebUI新技术mcpo横空出世!支持ollama!轻松支持各种MCP Server!Cline+Claude3.7轻松开发MCP服务_哔哩哔哩_bilibili Open WebUI 的 MCPo 项目:将 MCP 工具无缝集成到 OpenAPI 的创新解决方案 随着人工智能工具和模型的快速发展,如何高效、安全地将这些工具集成到标准化的 API 接口中成为了开发者面临的重要挑战。Open WebUI 的 MCPo 项目(Model Context Protocol-to-OpenAPI Proxy Server)正是为了解决这一问题而设计的。本文将带您深入了解 MCPo 的功能、优势及其对开发者生态的影响。 什么是 MCPo? MCPo 是一个简单、可靠的代理服务器,能够将任何基于 MCP 协议的工具转换为兼容

By Ne0inhk
Qwen3+Qwen Agent 智能体开发实战,打开大模型MCP工具新方式!(一)

Qwen3+Qwen Agent 智能体开发实战,打开大模型MCP工具新方式!(一)

系列文章目录 一、Qwen3+Qwen Agent 智能体开发实战,打开大模型MCP工具新方式!(一) 二、Qwen3+Qwen Agent +MCP智能体开发实战(二)—10分钟打造"MiniManus" 前言 要说最近人工智能界最火热的开源大模型,必定是阿里发布不久的Qwen3系列模型。Qwen3模型凭借赶超DeepSeek-V3/R1的优异性能,创新的混合推理模式,以及极强的MCP能力迅速成为AI Agent开发的主流基座模型。大家可参考我的文章一文解析Qwen3大模型详细了解Qwen3模型的核心能力。有读者私信我: “Qwen3官网特地强调增强了Agent和代码能力,同时加强了对MCP的支持,那么我该如何利用Qwen3快速开发MCP应用呢?” 这就就需要使用我们今天的主角——Qwen官方推荐的开发工具Qwen-Agent ,本期分享我们就一起学习快速使用Qwen3+QwenAgent 接入MCP服务端,快速开发AI Agent应用! 一、注册 Qwen3 API-Key 本次分享通过阿里云百炼大模型服务平台API Key请求方式调用Qwen3大模型,获取服务平台

By Ne0inhk