[測速][快速筆記][轉載備份]_撰寫 Speedtest 測速 python 腳本

因為已經很少在高雄,所以其實兩三年前就有萌生計畫要把高雄的中華FTTH給停了(100M/40M)

約莫在2021年高雄家裡換了大大寬頻,發現近來有線電視業者提供的網路品質上似乎已經有追上中華電信的水準。

加上划算的價格,決定試試看,降速回約60M的方案(月付金僅須300多的樣子)。回南部時順便親自監工,目前都還是走電視Cable入戶,高雄老家是配了一台Askey的Modem,有WiFi功能。

用了一年多,其實每次回南部的體驗都不差,網路速度也還算ok,也沒聽過長輩抱怨家中網路有斷線情事。

於是乎2022年三月時,申裝一年的中華電信雙RJ11纜線(當時社區光纖都還沒拉到巷口後來已經有純光的走法)100M/40M決定給他退了(月繳約900),換TBC的500M/50M的Cable方案。

其實用了9個月,大致上都沒甚麼問題,除了夏天時Cable modem如果散熱沒弄好悶在光化箱,是真的會變得瞬斷,但開弱電箱散熱又能回穩。

直到最近發現家中TBC不乖,不知道什麼原因有時測速當下連100M都跑不出來,但多跑了幾次速度又回穩…,而也已經排除區網內設備影響。

令人不禁猜疑是不是上游端有什麼Pattern在調整線路QoS的機制存在…

為了避免夜長夢多,不如直接寫的Speedtest腳本Run在內網Linux Server上…

於是乎直接找了網友寫好的腳本

這裡我也做了一點修改,讓Server每次都能選擇指定清單內的

在用之前,請pip install speedtest-cli

以及sudo apt install speedtest-cli一下

import speedtest as st
import pandas as pd
from datetime import datetime

servers = [17206, 18450, 29109, 4939, 14655]
def get_new_speeds():
    speed_test = st.Speedtest()
    speed_test.get_servers(servers)
    speed_test.get_best_server()

    # Get ping (miliseconds)
    ping = speed_test.results.ping
    # Perform download and upload speed tests (bits per second)
    download = speed_test.download()
    upload = speed_test.upload()

    # Convert download and upload speeds to megabits per second
    download_mbs = round(download / (10**6), 2)
    upload_mbs = round(upload / (10**6), 2)

    return (ping, download_mbs, upload_mbs)


def update_csv(internet_speeds):
    # Get today's date in the form Month/Day/Year
    date_today = datetime.today().strftime("%m/%d/%Y %H:%M:%S")
    # File with the dataset
    csv_file_name = "internet_speeds_dataset.csv"

    # Load the CSV to update
    try:
        csv_dataset = pd.read_csv(csv_file_name, index_col="Date")
    # If there's an error, assume the file does not exist and create\
    # the dataset from scratch
    except:
        csv_dataset = pd.DataFrame(
            list(),
            columns=["Ping (ms)", "Download (Mb/s)", "Upload (Mb/s)"]
        )

    # Create a one-row DataFrame for the new test results
    results_df = pd.DataFrame(
        [[ internet_speeds[0], internet_speeds[1], internet_speeds[2] ]],
        columns=["Ping (ms)", "Download (Mb/s)", "Upload (Mb/s)"],
        index=[date_today]
    )

    #updated_df = csv_dataset.append(results_df, sort=False)
    updated_df = pd.concat([csv_dataset, results_df])

    # https://stackoverflow.com/a/34297689/9263761
    updated_df\
        .loc[~updated_df.index.duplicated(keep="last")]\
        .to_csv(csv_file_name, index_label="Date")


new_speeds = get_new_speeds()
update_csv(new_speeds)

要注意請不要把這個Python檔存成speedtest.py這種命名,

我在這小翻車了一下這樣會讓python不知道正確的speedtest module到底用哪一個XD

簡單說明我跟原版不一樣的點

servers = [17206, 18450, 29109, 4939, 14655]

這行分別是可以用speedtest-cli –list 指令直接敲在console去看離你最近的server,這樣每次才不會因為多了測速server而讓測試的server每次都變化。

另外也調整了一下這段,用Pandas新版的做法去改,不然跑的時候會warning過時的寫法(雖然也不影響結果,但就是礙眼XD)

#updated_df = csv_dataset.append(results_df, sort=False)

updated_df = pd.concat([csv_dataset, results_df])

然後可以利用crontab -e 去自動執行寫好的python 檔

0 * * * * python3 /home/svh/speedtest_script.py

這樣每小時就會運行一次了

最後輸出的結果會在

internet_speeds_dataset.csv 內存放著。

可以統計一陣子之後再拉去EXCEL做精美圖表

至於如果你想串甚麼PowerBI之類的炫技…就自行發揮

re:

https://github.com/sivel/speedtest-cli/wiki

Leave a comment

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料