Python 編寫的分析網速程式

2021-04-14 08:14:08 字數 4772 閱讀 8799

我們宿舍原來是 7 個人共享乙個 1m 的 adsl 寬頻,最近感覺這點頻寬用起來是越來越力不從心了,所以我們打算做一次全面的分析,看看到底是誰的哪種網路應用占用頻寬比較多。

首先得測試一下大家在正常使用時的網速。還好我們的 tp-link 的那個路由器有流量統計的功能,開啟這功能後路由器的管理頁面可以看到資料。但只有每時刻的總流量,手工來做的話還得每幾秒計一次資料,然後再除以總時間才能算得出每秒的速率。

本想用 c++ 來寫個程式給它自動獲取頁面,然後提取資料自動計算出來。後來想想還是選用的 python。python 的 httplib 就可以很方便的收發 http 資料,sgmllib 可以很方便的分析 html 格式的資料。

這次是第一次使用 sgmllib。上網查了好久才知道這個東西的用法,但是國內好像很少有講這些的,後來大多都是從國外的英文站點看到的文章學習來的。使用的時候,一般自己寫乙個類來繼承 sgmlparser,在 feed() 函式裡面將要分析的資料輸入進來。然後寫乙個 start_*** 和 end_*** 的函式來處理名字為 *** 的 html 標籤,也就是每當遇到 *** 的標籤就會用那兩個函式處理。handle_data 函式是處理標籤框起來的資料的,比如abcd 這樣,abcd 就是標籤 *** 框起來的資料。

全部**如下:

# 輸入分析的資料 s

14 def

parse(self, s):

15         self.feed(s)

16         self.close()

17 18

19 #**********==== 處理 p 標籤以獲得 ip 位址

20 def

start_p(self, attributes):

21 for name, value in attributes:

22 if name == "

align

" and value == "

left":

23                 self.status = 1

24                 self.in_tag = 1

25 26

defend_p(self):

27         self.status = 0

28 #**********==== tag_p

29 30

31 32

#**********==== 處理 td 標籤以獲得流量的位元組數

33 def

start_td(self, attributes):

34 for name, value in attributes:

35 if name == "

width

" and value == "85"

:36

# 因為有兩個 td 標籤是 width = 85 的, 所以這裡特殊處理一下

37                 self.td = self.td + 1

38                 self.status = 2

39                 self.in_tag = 1

40 41

defend_p(self):

42         self.status = 0

43 #**********==== tag_td

44 45

46 47

defhandle_data(self, data):

48 52

56 57

58 def

get_ipaddr(self):

59 return self.ipaddr

60 61

defget_ipdata(self):

62 return self.ipdata

63 64

65 print

"test starting...

"66

67 headers =

80 81

while 1:

82     ipaddr =

83     ipdata =

84     result =

85 86

# 每隔 2 秒獲取一次資料, 共獲取兩次

93             r1.read(3796)# 前面有一部分資料完全沒有用, 所以預讀一下忽略掉它

94             d = r1.read()# 開始有用的資料

95 96             sg = speedhtml()

97             sg.feed(d)

98 102         con1.close()

103         time.sleep(2)

104

105

for i in range(0, len(ipaddr)):

106

# 計算剛才獲取資料那段時間的流量,單位: kb/s

print

"ip:

", ipaddr[i], "

is "

, result[i], "

kb/s

"109

print

"******************************"

執行結果如下:

test starting...

ip:  192.168.36.41  is  65  kb/s

ip:  192.168.36.55  is  0  kb/s

ip:  192.168.36.102  is  4  kb/s

ip:  192.168.36.103  is  0  kb/s

ip:  192.168.36.106  is  0  kb/s

ip:  192.168.36.205  is  0  kb/s

******************************

ip:  192.168.36.41  is  58  kb/s

ip:  192.168.36.55  is  0  kb/s

ip:  192.168.36.102  is  4  kb/s

ip:  192.168.36.103  is  0  kb/s

ip:  192.168.36.106  is  0  kb/s

ip:  192.168.36.205  is  0  kb/s

******************************

ip:  192.168.36.41  is  43  kb/s

ip:  192.168.36.55  is  0  kb/s

ip:  192.168.36.102  is  4  kb/s

ip:  192.168.36.103  is  0  kb/s

ip:  192.168.36.106  is  0  kb/s

ip:  192.168.36.205  is  0  kb/s

******************************

ip:  192.168.36.41  is  52  kb/s

ip:  192.168.36.55  is  0  kb/s

ip:  192.168.36.102  is  7  kb/s

ip:  192.168.36.103  is  0  kb/s

ip:  192.168.36.106  is  0  kb/s

ip:  192.168.36.205  is  0  kb/s

******************************

ip:  192.168.36.41  is  49  kb/s

ip:  192.168.36.55  is  0  kb/s

ip:  192.168.36.102  is  6  kb/s

ip:  192.168.36.103  is  0  kb/s

ip:  192.168.36.106  is  0  kb/s

ip:  192.168.36.205  is  0  kb/s

******************************

python編寫定時關機程式

import os,sys,time from pyqt5 import qtcore,qtwidgets,qtgui class guanji object defpageshow self,page 設定視窗的位置和大小 page.setgeometry 400,400,400,200 設定視窗...

Python編寫備份程式指令碼

編寫backup.py指令碼,實現以下目標 1 需要支援完全和增量備份 2 周一執行完全備份 3 其他時間執行增量備份 4 備份檔案需要打包為tar檔案並使用gzip格式壓縮 import os import tarfile import hashlib import pickle from tim...

python程式分析 如何分析Python指令碼?

如chris lawlor所示cprofile是乙個很棒的工具,可以很容易地用於列印到螢幕上 python m cprofile s time mine.py 或提交 python m cprofile o output.file mine.py ps 如果您使用的是ubuntu,請確保安裝pyth...