定时监测并记录网速的脚本

wen 实用脚本 1

本文目录导读:

定时监测并记录网速的脚本

  1. 方案一:Python脚本(最完整)
  2. 方案二:简单的Shell脚本(Linux/Mac)
  3. 方案三:Windows Batch脚本
  4. 使用说明

我来为您提供一个定时监测并记录网速的脚本,这个脚本可以定期测试网络速度并保存记录。

Python脚本(最完整)

首先安装依赖

pip install speedtest-cli schedule

Python监测脚本

#!/usr/bin/env python3
"""
网络速度定时监测脚本
功能:定时测试网速并记录到文件
"""
import speedtest
import csv
import os
from datetime import datetime
import schedule
import time
import logging
from typing import Dict, Any
# 配置
LOG_FILE = "network_speed_log.csv"
TEST_INTERVAL = 30  # 测试间隔(分钟)
LOG_LEVEL = logging.INFO
# 设置日志
logging.basicConfig(
    level=LOG_LEVEL,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('speed_monitor.log'),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)
class SpeedMonitor:
    def __init__(self, log_file: str = LOG_FILE):
        self.log_file = log_file
        self.init_csv()
    def init_csv(self):
        """初始化CSV文件,如果不存在则创建并写入表头"""
        if not os.path.exists(self.log_file):
            with open(self.log_file, 'w', newline='', encoding='utf-8') as f:
                writer = csv.writer(f)
                writer.writerow([
                    '时间', 
                    '下载速度(Mbps)', 
                    '上传速度(Mbps)', 
                    '延迟(ms)',
                    '服务器',
                    'IP地址'
                ])
            logger.info(f"创建日志文件: {self.log_file}")
    def test_speed(self) -> Dict[str, Any]:
        """测试网络速度"""
        try:
            logger.info("开始网速测试...")
            st = speedtest.Speedtest()
            # 获取最佳服务器
            st.get_best_server()
            # 测试下载速度(转换为Mbps)
            download_speed = st.download() / 1_000_000
            logger.info(f"下载速度测试完成: {download_speed:.2f} Mbps")
            # 测试上传速度(转换为Mbps)
            upload_speed = st.upload() / 1_000_000
            logger.info(f"上传速度测试完成: {upload_speed:.2f} Mbps")
            # 获取服务器信息和延迟
            server = st.results.server
            ping = st.results.ping
            return {
                'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                'download': round(download_speed, 2),
                'upload': round(upload_speed, 2),
                'ping': round(ping, 1),
                'server': server.get('sponsor', 'Unknown'),
                'ip': st.results.client.get('ip', 'Unknown')
            }
        except speedtest.SpeedtestException as e:
            logger.error(f"网速测试失败: {str(e)}")
            return None
        except Exception as e:
            logger.error(f"未知错误: {str(e)}")
            return None
    def save_result(self, result: Dict[str, Any]):
        """保存测试结果到CSV文件"""
        if result is None:
            return
        try:
            with open(self.log_file, 'a', newline='', encoding='utf-8') as f:
                writer = csv.writer(f)
                writer.writerow([
                    result['timestamp'],
                    result['download'],
                    result['upload'],
                    result['ping'],
                    result['server'],
                    result['ip']
                ])
            logger.info(f"结果已保存: {result['download']}Mbps down / {result['upload']}Mbps up")
        except Exception as e:
            logger.error(f"保存结果失败: {str(e)}")
    def run_test(self):
        """执行一次完整的测试"""
        logger.info("=" * 50)
        logger.info("开始网速测试周期")
        result = self.test_speed()
        self.save_result(result)
        if result:
            print(f"\n📊 测试结果:")
            print(f"  时间: {result['timestamp']}")
            print(f"  下载速度: {result['download']} Mbps")
            print(f"  上传速度: {result['upload']} Mbps")
            print(f"  延迟: {result['ping']} ms")
            print(f"  服务器: {result['server']}")
            print(f"  IP地址: {result['ip']}")
        logger.info("测试周期完成")
        logger.info("=" * 50)
def main():
    """主函数"""
    monitor = SpeedMonitor()
    # 立即执行一次测试
    monitor.run_test()
    # 设置定时任务
    schedule.every(TEST_INTERVAL).minutes.do(monitor.run_test)
    print(f"\n🕐 定时监测已启动,每 {TEST_INTERVAL} 分钟测试一次")
    print(f"📁 日志文件: {LOG_FILE}")
    print("按 Ctrl+C 停止监测\n")
    try:
        while True:
            schedule.run_pending()
            time.sleep(1)
    except KeyboardInterrupt:
        print("\n👋 监测已停止")
        logger.info("监测程序已停止")
if __name__ == "__main__":
    main()

简单的Shell脚本(Linux/Mac)

#!/bin/bash
# 网速监测脚本
LOG_FILE="network_speed.log"
INTERVAL=300  # 5分钟
# 创建日志文件头
echo "时间, 下载速度(Mbps), 上传速度(Mbps), 延迟(ms)" > $LOG_FILE
echo "开始监测网速,每 $((INTERVAL/60)) 分钟记录一次..."
while true; do
    # 获取当前时间
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    # 使用 iperf3 测试(需要服务器)
    # 或者使用 curl 简单测试
    DOWNLOAD_SPEED=$(curl -s -o /dev/null -w '%{speed_download}' http://speedtest.tele2.net/100MB.zip 2>/dev/null)
    DOWNLOAD_MBPS=$(echo "scale=2; $DOWNLOAD_SPEED * 8 / 1000000" | bc)
    # 记录结果
    echo "$TIMESTAMP, $DOWNLOAD_MBPS, 0, 0" >> $LOG_FILE
    echo "[$TIMESTAMP] 下载速度: ${DOWNLOAD_MBPS}Mbps"
    sleep $INTERVAL
done

Windows Batch脚本

@echo off
setlocal enabledelayedexpansion
:: 配置
set LOG_FILE=network_speed_log.csv
set INTERVAL=300
:: 创建日志文件头
echo 时间, 下载速度(Mbps), 上传速度(Mbps), 延迟(ms) > %LOG_FILE%
echo 开始监测网速...
:loop
:: 获取当前时间
for /f "tokens=*" %%a in ('wmic os get localdatetime ^| find "."') do set datetime=%%a
set TIMESTAMP=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2% %datetime:~8,2%:%datetime:~10,2%:%datetime:~12,2%
:: 测试网速(需要安装speedtest-cli)
:: speedtest-cli --simple >> temp.txt
:: 记录到文件
echo %TIMESTAMP%, 测试中, 测试中, 测试中 >> %LOG_FILE%
echo [%TIMESTAMP%] 网速测试中...
:: 等待
timeout /t %INTERVAL% /nobreak > nul
goto loop

使用说明

Python版本(推荐):

  1. 保存脚本为 speed_monitor.py
  2. 安装依赖:pip install speedtest-cli schedule
  3. 运行:python speed_monitor.py

配置选项:

  • TEST_INTERVAL: 测试间隔(分钟)
  • LOG_FILE: 日志文件名
  • 可自定义保存格式和数据量

数据分析建议:

# 数据分析脚本示例
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_csv('network_speed_log.csv')
df['时间'] = pd.to_datetime(df['时间'])
# 绘制图表
plt.figure(figsize=(12, 6))
plt.plot(df['时间'], df['下载速度(Mbps)'], label='下载速度')
plt.plot(df['时间'], df['上传速度(Mbps)'], label='上传速度')
plt.xlabel('时间')
plt.ylabel('速度 (Mbps)')'网速变化趋势')
plt.legend()
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('speed_trend.png')
plt.show()
# 统计信息
print(f"平均下载速度: {df['下载速度(Mbps)'].mean():.2f} Mbps")
print(f"最大下载速度: {df['下载速度(Mbps)'].max():.2f} Mbps")
print(f"最小下载速度: {df['下载速度(Mbps)'].min():.2f} Mbps")

这个脚本会自动运行网速测试,记录结果到CSV文件,并显示统计信息,您可以根据需要调整测试间隔和日志格式。

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