如何用实用脚本自动测试网速并保存结果?

wen 实用脚本 5

如何用实用脚本自动测试网速并保存结果?——打造你的专属网络监测工具

📚 目录导读

  • 为什么需要自动测试网速?
  • 核心工具与脚本语言选择
  • 实战脚本编写(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-clipython3 -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分钟以上,至少运行一周后导出数据回头分析,你会发现,那些“感觉网络变慢”的时刻,原来都有数字证据。


使用本方法前,请确保理解脚本逻辑,调整文件路径与定时频率,自动化的目的是让技术服务于生活,而不是让生活被技术绑架。

抱歉,评论功能暂时关闭!