衆所周知,Python有很對第三方模塊,只要熟練應用這些模塊便可完成各類任務,在開始採集數據以前須要存在一個目標站點,而後使用Python腳本進行質量數據採集。探測web質量須要用到Python的pycurl模塊,它能夠獲取HTTP請求的狀態碼,DNS解析時間、創建鏈接時間、傳輸結束總時間,下載數據包大小,HTTP頭部大小、平均下載速度等參數。從這些參數中能夠了解web的服務質量如何,而後進行優化等操做。將獲取的數據寫到Excel表格中,這裏使用的是Python的xlsxwrite模塊,實現的思路是將獲取的數據保存到一個文件裏面,而後再去建立一個Excel表,將數據寫入到表格中而後繪製圖表,以此類推,文件裏的數據會追加,以後建立的Excel表會被徹底覆蓋,固然建立Excel表格的模塊會不少,這裏再也不細說。html
Python腳本編寫前的準備:web
- 下載pycurl模塊,直接雙擊安裝便可。
- xlsxwriter使用pip命令安裝,此處須要注意環境變量是否配置。
一、因爲pycurl是下載下來直接安裝的,這裏就不寫了,比較簡單。
二、安裝xlsxwriter模塊(需可鏈接Internet)
curl
三、採集數據的腳本以下:ide
# _._ coding:utf-8 _._ import os,sys import pycurl import xlsxwriter URL="www.baidu.com" #探測目標的url,須要探測哪一個目標,這裏改哪一個便可 c = pycurl.Curl() #建立一個curl對象 c.setopt(pycurl.URL, URL) #定義請求的url常量 c.setopt(pycurl.CONNECTTIMEOUT, 10) #定義請求鏈接的等待時間 c.setopt(pycurl.TIMEOUT, 10) #定義請求超時時間 c.setopt(pycurl.NOPROGRESS, 1) #屏蔽下載進度條 c.setopt(pycurl.FORBID_REUSE, 1) #完成交互後強制斷開鏈接,不重用 c.setopt(pycurl.MAXREDIRS, 1) #指定HTTP重定向的最大數爲1 c.setopt(pycurl.DNS_CACHE_TIMEOUT, 30) #建立一個文件對象,以’wb’方式打開,用來存儲返回的http頭部及頁面內容 indexfile = open(os.path.dirname(os.path.realpath(__file__))+"/content.txt","wb") c.setopt(pycurl.WRITEHEADER, indexfile) #將返回的http頭部定向到indexfile文件 c.setopt(pycurl.WRITEDATA, indexfile) #將返回的html內容定向到indexfile文件 c.perform() NAMELOOKUP_TIME = c.getinfo(c.NAMELOOKUP_TIME) #獲取DNS解析時間 CONNECT_TIME = c.getinfo(c.CONNECT_TIME) #獲取創建鏈接時間 TOTAL_TIME = c.getinfo(c.TOTAL_TIME) #獲取傳輸的總時間 HTTP_CODE = c.getinfo(c.HTTP_CODE) #獲取HTTP狀態碼 SIZE_DOWNLOAD = c.getinfo(c.SIZE_DOWNLOAD) #獲取下載數據包大小 HEADER_SIZE = c.getinfo(c.HEADER_SIZE) #獲取HTTP頭部大小 SPEED_DOWNLOAD=c.getinfo(c.SPEED_DOWNLOAD) #獲取平均下載速度 print u"HTTP狀態碼: %s" %(HTTP_CODE) #輸出狀態碼 print u"DNS解析時間: %.2f ms" %(NAMELOOKUP_TIME*1000) #輸出DNS解析時間 print u"創建鏈接時間: %.2f ms" %(CONNECT_TIME*1000) #輸出創建鏈接時間 print u"傳輸結束總時間: %.2f ms" %(TOTAL_TIME*1000) #輸出傳輸結束總時間 print u"下載數據包大小: %d bytes/s" %(SIZE_DOWNLOAD) #輸出下載數據包大小 print u"HTTP頭部大小: %d byte" %(HEADER_SIZE) #輸出HTTP頭部大小 print u"平均下載速度: %d bytes/s" %(SPEED_DOWNLOAD) #輸出平均下載速度 indexfile.close() #關閉文件 c.close() #關閉curl對象 f = file('chart.txt','a') #打開一個chart.txt文件,以追加的方式 f.write(str(HTTP_CODE)+','+str(NAMELOOKUP_TIME*1000)+','+str(CONNECT_TIME*1000)+','+str(TOTAL_TIME*1000)+','+str(SIZE_DOWNLOAD/1024)+','+str(HEADER_SIZE)+','+str(SPEED_DOWNLOAD/1024)+'\n') #將上面輸出的結果寫入到chart.txt文件 f.close() #關閉chart.txt文件 workbook = xlsxwriter.Workbook('chart.xlsx') #建立一個chart.xlsx的excel文件 worksheet = workbook.add_worksheet() #建立一個工做表對象,默認爲Sheet1 chart = workbook.add_chart({'type': 'column'}) #建立一個圖表對象 title = [URL , u' HTTP狀態碼',u' DNS解析時間',u' 創建鏈接時間',u' 傳輸結束時間',u' 下載數據包大小',u' HTTP頭部大小',u' 平均下載速度'] #定義數據表頭列表 format=workbook.add_format() #定義format格式對象 format.set_border(1) #定義format對象單元格邊框加粗(1像素)的格式 format_title=workbook.add_format() #定義format_title格式對象 format_title.set_border(1) #定義format_title對象單元格邊框加粗(1像素)的格式 format_title.set_bg_color('#00FF00') #定義format_title對象單元格背景顏色爲’#cccccc’ format_title.set_align('center') #定義format_title對象單元格居中對齊的格式 format_title.set_bold() #定義format_title對象單元格內容加粗的格式 worksheet.write_row(0, 0,title,format_title) #將title的內容寫入到第一行 f = open('chart.txt','r') #以只讀的方式打開chart.txt文件 line = 1 #定義變量line等於1 for i in f: #開啓for循環讀文件 head = [line] #定義變量head等於line lineList = i.split(',') #將字符串轉化爲列表形式 lineList = map(lambda i2:int(float(i2.replace("\n", ''))), lineList) #將列表中的最後\n刪除,將小數點後面的數字刪除,將浮點型轉換成整型 lineList = head + lineList #兩個列表相加 worksheet.write_row(line, 0, lineList, format) #將數據寫入到execl表格中 line += 1 average = [u'平均值', '=AVERAGE(B2:B' + str((line - 1)) +')', '=AVERAGE(C2:C' + str((line - 1)) +')', '=AVERAGE(D2:D' + str((line - 1)) +')', '=AVERAGE(E2:E' + str((line - 1)) +')', '=AVERAGE(F2:F' + str((line - 1)) +')', '=AVERAGE(G2:G' + str((line - 1)) +')', '=AVERAGE(H2:H' + str((line - 1)) +')'] #求每一列的平均值 worksheet.write_row(line, 0, average, format) #在最後一行數據下面寫入平均值 f.close() #關閉文件 def chart_series(cur_row, line): #定義一個函數 chart.add_series({ 'categories': '=Sheet1!$B$1:$H$1', #將要輸出的參數做爲圖表數據標籤(X軸) 'values': '=Sheet1!$B$'+cur_row+':$H$'+cur_row, #獲取B列到H列的數據 'line': {'color': 'black'}, #線條顏色定義爲black 'name': '=Sheet1!$A'+ cur_row, #引用業務名稱爲圖例項 }) for row in range(2, line + 1): #從第二行開始到最後一次取文本中的行的數據系列函數調用 chart_series(str(row), line) chart.set_size({'width':876,'height':287}) #定義圖表的寬度及高度 worksheet.insert_chart(line + 2, 0, chart) #在最後一行數據下面的兩行處插入圖表 workbook.close() #關閉execl文檔
四、運行腳本後,會在腳本所在的目錄下產生三個文件,兩個是txt文本文件,一個是Excel文件,執行腳本後,會顯示以下信息:
函數
五、當前目錄下產生的文件以下:
優化
其中,兩個txt格式的文件都是爲了給Excel作鋪墊的,因此能夠選擇性忽略便可,主要是看Excel中的數據。Excel中的數據以下(如下是執行6次腳本後的顯示結果,也就是說探測了6次):url
———————— 本文至此結束,感謝閱讀 ————————excel