[Python3] 정기적으로 인터넷 회선 속도를 측정하여 CSV에 저장

16913 단어 인터넷Python

인터넷 회선 속도의 시퀀스 데이터를 CSV로 내보내려고 합니다.


나는 인터넷의 회선 속도가 하루나 일주일 동안 어떻게 변화하는지 가시화하고 싶다.나는 각양각색의 도구가 있다고 생각하지만, 익숙한 파이썬에 좋은 도서관이 있다면 그걸로 쓰고 싶은데, 과연 있다.편하네.선인들이 정기적으로 실행하는 스크립트도 공개됐기 때문에 완전히 복사해서 살짝 수정하겠습니다.

1분마다 고주파로 두드리는 이 방법이라면 IP가 막힐 수 있으니 주의하세요.지금 조사 중이야, 한 것 같아.


환경


macOS BigSur 11.3.1
Python3.9
speedtest_regulary.py
import speedtest
import datetime
import time
import csv
import logging

INTERVAL_SEC = 60

def get_speed_tester():
    servers = []
    stester = speedtest.Speedtest()
    stester.get_servers(servers)
    stester.get_best_server()
    return stester

def get_timestamp():
    date = datetime.datetime.now()
    timestamp = str(date.strftime('%Y-%m-%d %H:%M:%S'))
    return timestamp

def test_speed(stester):
    down_result = str(int(stester.download()))
    up_result = str(int(stester.upload()))
    return down_result, up_result

def command_line_runner():
    stester = get_speed_tester()
    print('time,down(bps),up(bps)')
    logger = logging.getLogger('SpeedtestLogging')
    fh = logging.FileHandler('speedtestlogging.log')
    logger.addHandler(fh)
    sh = logging.StreamHandler()
    logger.addHandler(sh)

    while True:
        try:
            t1 = time.time()
            timestamp = get_timestamp()
            down_result, up_result = test_speed(stester)
            print(timestamp + ',' + down_result + ',' + up_result)
            with open('speedtest_regulary_output.csv', 'a') as f:
                writer = csv.writer(f)
                writer.writerow([timestamp, down_result, up_result])
            t2 = time.time()
            next_sleep_time = int(INTERVAL_SEC - (t2 - t1))
            time.sleep(next_sleep_time)

        except KeyboardInterrupt:
            print("Ctrl+Cで停止")
            break

        except Exception as err:
            logger.exception('Raise Exception: %s', err)

if __name__ == '__main__':
    command_line_runner()
또한 SSL 연결은 루트 인증서를 받아야 합니다.
speedtest.ConfigRetrievalError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)>
↑ 처음 움직일 때 이런 느낌의 실수를 뱉었다.
해결 방법은terminal로 다음과 같은 조작을 실행하는 것이다.
/Applications/Python\ 3.9/Install\ Certificates.command
https://github.com/pyenv/pyenv/issues/1643
Python 3.7 앞으로 이 주문이 필요할 것 같습니다.같은 오류가 발생했을 때 환경에 따라 같은 일을 시도해 보세요.
그럼 우리 쓴 각본의 행동을 봅시다.
↓ 생성된 CSV 파일

logging에서 오류를 포착하고 저장하려고 시도했습니다.그러나speedtest 라이브러리이기 때문에 상당히 잘 처리되었습니다.
https://github.com/sivel/speedtest-cli/blob/master/speedtest.py
나는 실행하면서 와이파이를 떨어뜨려 보았다. 이런 상황에서 업로드/다운로드는 모두 0bps의 데이터를 만들었다. 위와 같다.logging은 어떤 내용도 추가하지 않았습니다.네트워크 오류가 완전히 제거되지 않을 수도 있습니다.그렇게 지도 모른다, 아마, 아마...도대체 스피드 테스트를 하기 위해서야?
숫자의 단위이지만 1024를 나누면 kbps, 1024를 나누면 mbps이다.

보충하여 기록하다


아니오, 냉정하게 파이썬을 생각해 보세요.sleep () 로 자주 이동하는 것은 다르죠.
cron으로 정기적으로 실행합니다.
speedtest_regulary_cron.py
import speedtest
import datetime
import csv
import logging


def get_speed_tester():
    servers = []
    stester = speedtest.Speedtest()
    stester.get_servers(servers)
    stester.get_best_server()
    return stester

def get_timestamp():
    date = datetime.datetime.now()
    timestamp = str(date.strftime('%Y-%m-%d %H:%M:%S'))
    return timestamp

def test_speed(stester):
    down_result = str(int(stester.download()))
    up_result = str(int(stester.upload()))
    return down_result, up_result

def command_line_runner():
    stester = get_speed_tester()
    logger = logging.getLogger('SpeedtestLogging')
    fh = logging.FileHandler('speedtestlogging.log')
    logger.addHandler(fh)
    sh = logging.StreamHandler()
    logger.addHandler(sh)


    try:
        timestamp = get_timestamp()
        down_result, up_result = test_speed(stester)
        # print(timestamp + ',' + down_result + ',' + up_result)
        with open('speedtest_regulary_output.csv', 'a') as f:
            writer = csv.writer(f)
            writer.writerow([timestamp, down_result, up_result])

    except Exception as err:
        logger.exception('Raise Exception: %s', err)

if __name__ == '__main__':
    command_line_runner()
1분 간격으로 이걸 이동합시다.
terminal로
$ crontab -e
에서 설명한 대로 해당 매개변수의 값을 수정합니다.
/tmp/crontab.
* * * * * /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 /Users/y_mohrey/Desktop/speedtest_regulary_cron.py
응, 이렇게 하면 움직이지 않을 거야.
cron은 PATH 주위에 함정이 많습니다.나는 Python의 본체든 실행 파일이든 절대 경로로 쓰는 것이 매우 중요하다는 것을 안다.그럼에도 불구하고 이 각본은 아직 움직이지 않았다.차례대로 추서하다.

참고 자료


speedtest-cli의 Python API(본사)
https://github.com/sivel/speedtest-cli/wiki
스크립트는 거의 우리의 복제품이다.
https://qiita.com/yokobonbon/items/67deb3fab84b0c0954e0
SSL 연결에 오류가 발생하면 응급처치로 PATH를 임시로 통과하는 방법이 효과적입니다.
여기에 쓴 방법에서terminal을 닫고 다시 열면 설정이 원상태로 회복됩니다.해결 방법은 본문에서 쓴 방법이다.
https://qiita.com/tommy19970714/items/96edba36dfde468e26f3
크론은 곡자입니다.
https://qiita.com/syunyo/items/69c3523a8c500b37f33f
https://tanuhack.com/cron/
speedtest 인증 주변 오류
https://community.home-assistant.io/t/issues-with-speedtest-automation/290967
알고 있는speedtest 오류 (cron에서 실행할 때 오류가 발생한 것 같지만 복구되었습니다.)
https://github.com/home-assistant/core/issues/47673

좋은 웹페이지 즐겨찾기