如何用实用脚本自动测试网速并保存结果?——打造你的专属网络监测工具
📚 目录导读
- 为什么需要自动测试网速?
- 核心工具与脚本语言选择
- 实战脚本编写(Python + speedtest-cli)
- 常见问题与解答(FAQ)
- 进阶:日志分析与告警设置
- 总结与建议
为什么需要自动测试网速?
许多用户发现,当网络时好时坏时,手动点击测速网站既麻烦又无法捕捉到波动规律。通过脚本自动测试网速并保存结果,你可以:

- 客观记录网络质量的长期变化(如ISP是否限速、高峰期是否掉速)
- 生成可视化报告,便于向宽带运营商投诉或自我诊断
- 在特定时间(如凌晨3点)自动测速,避开人为干扰
真实案例:某用户投诉宽带不达标,运维人员要求提供一周内的测速记录,手动测速需每天间隔2小时,耗时且易忘,使用脚本后,系统自动每小时采集一次数据,最终生成时间戳+带宽值的CSV文件,作为维权证据。
核心工具与脚本语言选择
| 工具/语言 | 优势 | 适用场景 |
|---|---|---|
Python + speedtest-cli |
跨平台、命令简单、结果可解析 | 个人电脑、树莓派、NAS |
Bash + speedtest-cli |
无需安装Python、兼容旧系统 | Linux服务器、OpenWrt路由器 |
| PowerShell | 无需额外依赖、原生支持Windows | Windows服务器或工作站 |
推荐组合:Python3 + speedtest-cli,因为其返回JSON结果,便于结构化存储。
安装命令(在终端执行):
pip install speedtest-cli
若权限不足,可加 --user 参数。
实战脚本编写(Python + speedtest-cli)
目标:每小时测速一次,将时间、下载速度、上传速度、延迟保存到CSV文件,并自动删除7天前的旧数据。
完整脚本代码(保存为 auto_speedtest.py):
import subprocess
import json
import csv
import os
from datetime import datetime, timedelta
LOG_FILE = "speedtest_log.csv"
RETENTION_DAYS = 7
def run_speedtest():
try:
result = subprocess.run(
["speedtest-cli", "--json"],
capture_output=True,
text=True,
timeout=120
)
data = json.loads(result.stdout)
return data
except (subprocess.TimeoutExpired, json.JSONDecodeError) as e:
print(f"测试失败: {e}")
return None
def save_to_csv(data):
file_exists = os.path.isfile(LOG_FILE)
with open(LOG_FILE, "a", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
if not file_exists:
writer.writerow(["时间", "下载(Mbps)", "上传(Mbps)", "延迟(ms)"])
writer.writerow([
datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
round(data["download"] / 1e6, 2), # 转成Mbps
round(data["upload"] / 1e6, 2),
data["ping"]
])
def cleanup_old_data():
if not os.path.isfile(LOG_FILE):
return
cutoff = datetime.now() - timedelta(days=RETENTION_DAYS)
rows = []
with open(LOG_FILE, "r") as f:
reader = csv.reader(f)
header = next(reader)
rows.append(header)
for row in reader:
try:
row_time = datetime.strptime(row[0], "%Y-%m-%d %H:%M:%S")
if row_time >= cutoff:
rows.append(row)
except (ValueError, IndexError):
continue
with open(LOG_FILE, "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(rows)
def main():
print(f"[{datetime.now()}] 开始测速...")
data = run_speedtest()
if data:
save_to_csv(data)
print(f"结果已保存:{data['download']/1e6:.2f} / {data['upload']/1e6:.2f} Mbps")
cleanup_old_data()
print("清理完成")
if __name__ == "__main__":
main()
设置定时任务(每小时执行一次):
- Windows:使用“任务计划程序”,触发器设为每小时,操作中指定Python解释器路径和脚本路径。
- Linux/macOS:使用crontab,添加行:
0 * * * * /usr/bin/python3 /path/to/auto_speedtest.py
常见问题与解答(FAQ)
Q1:脚本报错“speedtest-cli not found”怎么办?
A:安装speedtest-cli时,确保Python脚本的路径正确,若仍不行,尝试 pip3 install speedtest-cli 或 python3 -m speedtest-cli 测试。
Q2:如何将结果保存到云盘(如OneDrive、Google Drive)?
A:将脚本中的 LOG_FILE 路径改为云盘同步目录,例如Windows下 C:\Users\用户名\OneDrive\speedtest_log.csv,注意云盘同步有延迟,但不影响记录。
Q3:脚本运行时出现“Python不是内部或外部命令”错误?
A:这通常意味着Python未添加到系统环境变量,建议安装Python时勾选“Add Python to PATH”,或使用Anaconda发行版。
Q4:如何把速度单位改为MB/s(兆字节/秒)?
A:将代码中的 /1e6 改为 /8e6(因为1字节=8位),并修改表头文字,例如改为“下载(MB/s)”。
Q5:脚本在树莓派上运行,但速度测试结果总偏低?
A:树莓派的网络接口为USB转以太网,受CPU性能限制,测试结果可能偏低,建议使用 speedtest-cli --secure 选项测试HTTPS节点,并关闭其他网络活动。
进阶:日志分析与告警设置
生成可视化图标
使用Python的 matplotlib 库读取CSV文件,绘制折线图展示一天/一周的网速波动。
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("speedtest_log.csv")
df["时间"] = pd.to_datetime(df["时间"])
plt.plot(df["时间"], df["下载(Mbps)"], label="下载")
plt.legend()
plt.savefig("daily_speed.png")
设置阈值告警
在脚本中增加判断:若下载速度低于预设阈值(如10Mbps),发送邮件或钉钉Webhook通知。
if data["download"] / 1e6 < 10:
# 调用告警函数,如requests.post("https://oapi.dingtalk.com/robot/send?...")
print("警告:网速异常!")
多站点测试
若想测试到不同服务器的速度,可修改speedtest-cli参数:
speedtest-cli --server 12345 # 指定特定服务器ID
总结与建议
通过自动化脚本持续测试网速并保存结果,你可以:
- 摆脱手动记录,节省时间并获得连续数据
- 发现网络规律,比如每天晚8点降速可能是小区共享带宽
- 建立技术基础,进一步开发网页版监控看板或智能告警
建议首选Python版本,因为其易于扩展和调试,若你的设备性能极低(如旧款路由器),可考虑Bash脚本配合 speedtest-cli --csv 输出。
最后提醒:大量频繁测速可能会被部分ISP视为异常流量,建议将间隔设为30分钟以上,至少运行一周后导出数据回头分析,你会发现,那些“感觉网络变慢”的时刻,原来都有数字证据。
使用本方法前,请确保理解脚本逻辑,调整文件路径与定时频率,自动化的目的是让技术服务于生活,而不是让生活被技术绑架。