使用 Python 监控您的互联网连接
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
我住在德国,德国以其多元化而闻名。这里的人民多元化,文化多元化,网络连接质量也同样参差不齐。我的网络供应商坚称我的网络连接没有问题,但我还是决定编写一个程序来监控我的上传和下载速度。
入门
我们将使用 Python 中的两个很棒的包,分别是speedtest和matplotlib。speedtest会提供我们有关互联网连接的信息, 并matplotlib允许我们根据这些信息生成图表。
无论你是否使用虚拟环境,你都需要安装 speedtest 和 matplotlib。
pip install matplotlib
pip install speedtest-cli
我们还会用到一些 Python 内置包datetime。CSV csv(逗号分隔值)是一种快速存储数据的方法。我们将用它来存储我们的网速信息,然后使用 matplotlib 将这些信息可视化。
收集数据
创建一个名为 python 的文件monitor.py
touch monitor.py
然后我们把以下代码放在里面
import speedtest
s = speedtest.Speedtest()
while True:
print(s.download(), s.upload())
ctrl + C在按下按钮退出这个无限循环之前,我们应该会看到以下输出。
75020309.22943133 24381170.373616524
105192450.00822952 40653433.153288215
因此,通过创建一个名为 s 的 speedtest 实例并测试上传和下载速度,我们可以得到以比特每秒 (bps) 为单位的上传和下载速度。要将其转换为兆比特每秒 (Mb/s),我们可以执行以下操作,并将测试时间也考虑在内:
import speedtest
import datetime
s = speedtest.Speedtest()
while True:
time = datetime.datetime.now().strftime("%H:%M:%S")
downspeed = round((round(s.download()) / 1048576), 2)
upspeed = round((round(s.upload()) / 1048576), 2)
print(f"time: {time}, downspeed: {downspeed} Mb/s, upspeed: {upspeed} Mb/s")
由此得出:
time: 12:44:15, downspeed: 95.04 Mb/s, upspeed: 32.85 Mb/s
time: 12:44:35, downspeed: 99.46 Mb/s, upspeed: 38.76 Mb/s
time: 12:44:56, downspeed: 100.59 Mb/s, upspeed: 38.94 Mb/s
现在我们将把这些信息记录到 CSV 文件中。CSV 文件是大型文本文件,其中的值以逗号分隔。以下是我创建的一个 CSV 文件的示例:
time,downspeed,upspeed
12:17:01,100.05,38.28
12:17:21,100.53,37.85
12:17:42,74.87,25.92
我们先添加一个标题行,然后将信息拆分出来。我们可以把它想象成一个 Excel 表格:
为了在 Python 中记录到 csv 文件中,我们需要导入 CSV 包并“打开”一个 CSV 文件(如果文件不存在,它将创建一个)。
import speedtest
import datetime
import csv
s = speedtest.Speedtest()
with open('test.csv', mode='w') as speedcsv:
csv_writer = csv.DictWriter(speedcsv,
fieldnames=['time', 'downspeed', 'upspeed'])
csv_writer.writeheader()
while True:
time = datetime.datetime.now().strftime("%H:%M:%S")
downspeed = round((round(s.download()) / 1048576), 2)
upspeed = round((round(s.upload()) / 1048576), 2)
csv_writer.writerow({
'time': time,
'downspeed': downspeed,
"upspeed": upspeed
})
所以,趁这段代码运行 4-5 分钟的时候,我们可以讨论一下它到底在做什么。第 7 行with open实际上创建了一个名为test.csv`<header>` 的CSV 文件,并设置了标题 `<header> name`、`<header>` 和 `<header>`,然后将它们写入 CSV 文件。之后循环开始,每次 `speedtest` 执行测试时,它都会在 CSV 文件中写入一行,内容包含我们之前指定的时间、下载速度和上传速度。现在我们来看看具体情况。downspeedupspeed
time,downspeed,upspeed
12:51:16,99.29,38.66
12:51:37,100.67,38.79
12:51:57,99.7,38.79
12:52:17,92.89,31.99
12:52:38,99.4,38.96
好了,现在我们正在收集信息并将其存储在 CSV 文件中。你可以对文件名进行各种巧妙的处理,比如用今天的日期命名,datetime但现在我先把它当作测试用例。
你也可以设置一个检查,看看是否经过了一定的时间,如果过了时间就停止应用程序,但这就留给你自己发挥创造力吧。
数据可视化
我们再创建一个Python文件来生成网络连接图。这里我们将使用matplotlib库。
touch make_graph.py
import matplotlib.pyplot as plt
import csv
import matplotlib.ticker as ticker
times = []
download = []
upload = []
生成图表最简单的方法是使用数组。为了填充数组,我们需要遍历新的 CSV 文件。
with open('test.csv', 'r') as csvfile:
plots = csv.reader(csvfile, delimiter=',')
next(csvfile)
for row in plots:
times.append(str(row[0]))
download.append(float(row[1]))
upload.append(float(row[2]))
print(times, "\n", download, "\n", upload)
['12:51:16', '12:51:37', '12:51:57', '12:52:17', '12:52:38']
[99.29, 100.67, 99.7, 92.89, 99.4]
[38.66, 38.79, 38.79, 31.99, 38.96]
现在我们开始解析数据!`next(csvfile)` 实际上跳过了标题行(这些标题行仅供我们参考,对 Python 来说无关紧要)。接下来我们要使用 matplotlib,我对它并不精通。他们的文档非常详尽。
plt.figure(30, 30)
plt.plot(times, download, label='download', color='r')
plt.plot(times, upload, label='upload', color='b')
plt.xlabel('time')
plt.ylabel('speed in Mb/s')
plt.title("internet speed")
plt.legend()
plt.savefig('test_graph.jpg', bbox_inches='tight')
这段代码指示 matplotlibplt创建一个图形,并在图形上绘制标记为“download”和“upload”的线条,分别对应它们各自的数组。因此,对于 download 和 time 数组中的每个元素,图形上都会标记一个位置。最后,添加 x 轴和 y 轴的标签,并保存图形。
潜在改进
这是我最近完成的一个项目的简化版,它包含自动上传到云平台、每日定时上传以及记录最低下载速度等功能。我最初做这个项目是为了向我的网络供应商投诉,但我知道这样做就像对着一堵砖墙看图表一样徒劳无功。
如果您对本教程有任何疑问,请随时与我联系。
文章来源:https://dev.to/jsphwllng/monitor-your-internet-with-python-3pp8

