我們宿舍原來是 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
"ip:
", ipaddr[i], "
is "
, result[i], "
kb/s
"109
"******************************"
執行結果如下:
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...