1. 程式人生 > >Python之——實現探測Web服務質量

Python之——實現探測Web服務質量

HTTP服務是最流行的網際網路應用之一,服務質量的好壞關係到使用者體驗以及網站的運營服務水平,最常用的有兩個標準,一為服務的可用性,比如是否處於正常提供服務狀態,而不是出現404頁面或500頁面錯誤等;二是服務響應的速度,比如靜態類檔案下載時間都控制在毫秒級,動態CGI為秒級。本例項使用pycurl的setopt與getinfo方法時間HTTP服務質量的探測,獲取監控URL返回的HTTP狀態碼,HTTP狀態碼採用pycurl.HTTP_CODE常量,以及從HTTP請求到下載期間各環節的響應時間,通過pycurl.NAMELOOKUP_TIME、pycurl.CONNECT_TIME、pycurl.PRETRANSFER_TIME、pycurl.R等常量來時間。另外通過pycurl.WRITEHEADER、pycurl.WRITEDATA常量得到目標URL的HTTP響應頭部及頁面內容。具體程式碼如下:

# -*- coding:UTF-8 -*-
'''
Created on 2018年1月4日

@author: liuyazhuang
'''
import os, sys
import time
import pycurl

#探測的目標URL
URL= "http://www.baidu.com"
#建立一個Curl物件
c = pycurl.Curl()

#定義請求的URL常量
c.setopt(pycurl.URL, URL)
#定義請求連線的等待時間
c.setopt(pycurl.CONNECTTIMEOUT, 5)
#定義請求超時時間
c.setopt(pycurl.TIMEOUT, 5)
#遮蔽下載進度條
c.setopt(pycurl.NOPROGRESS, 1)
#完成互動後強制斷開連線,不重用
c.setopt(pycurl.FORBID_REUSE, 1)
#指定HTTP重定向的最大數為1
c.setopt(pycurl.MAXREDIRS, 1)
#設定儲存DNS資訊的時間為30秒
c.setopt(pycurl.DNS_CACHE_TIMEOUT, 30)
#建立一個檔案物件,以“wb”方式開啟,用來儲存返回的http頭部及頁面內容
indexfile = open(os.path.dirname(os.path.realpath(__file__)) + "/content.txt", "wb")
#將返回的HTTP HEADER定向到indexfile檔案
c.setopt(pycurl.WRITEHEADER, indexfile)
#將返回的HTML內容定向到indexfile檔案物件
c.setopt(pycurl.WRITEDATA, indexfile)
try:
    #提交請求
    c.perform()
except Exception, e:
    print "connection error: " + str(e)
    indexfile.close()
    c.close()
    sys.exit()
    
#獲取DNS解析時間
NAMELOOKUP_TIME = c.getinfo(c.NAMELOOKUP_TIME)
#獲取建立連線時間
CONNECT_TIME = c.getinfo(c.CONNECT_TIME)
#獲取從建立連線到準備傳輸所消耗的時間
PRETRANSFER_TIME = c.getinfo(c.PRETRANSFER_TIME)
#獲取從建立連線到傳輸開始消耗的時間
STARTTRANSFER_TIME = c.getinfo(c.STARTTRANSFER_TIME)
#獲取傳輸的總時間
TOTAL_TIME = c.getinfo(c.TOTAL_TIME)
#獲取HTTP狀態碼
HTTP_CODE = c.getinfo(c.HTTP_CODE)
#獲取下載資料包大小
SIZE_DOWNLOAD = c.getinfo(c.SIZE_DOWNLOAD)
#獲取HTTP頭部大小
HEADER_SIZE = c.getinfo(c.HEADER_SIZE)
#獲取平均下載速度
SPEED_DOWNLOAD = c.getinfo(c.SPEED_DOWNLOAD)
#列印輸出相關資料
print "HTTP狀態碼: %d" % (HTTP_CODE)
print "DNS解析時間: %.2f ms" % (NAMELOOKUP_TIME * 1000)
print "建立連線時間: %.2f ms" % (CONNECT_TIME * 1000)
print "準備傳輸時間: %.2f ms" % (PRETRANSFER_TIME * 1000)
print "傳輸開始時間: %.2f ms" % (STARTTRANSFER_TIME * 1000)
print "傳輸結束總時間: %.2f ms" %(TOTAL_TIME * 1000)
print "下載資料包大小: %d bytes/s" %(SIZE_DOWNLOAD)
print "HTTP頭部大小: %d byte" %(HEADER_SIZE)
print "平均下載速度: %d bytes/s" %(SPEED_DOWNLOAD)
#關閉檔案及Curl物件
indexfile.close()
c.close()
程式碼執行結果如下
HTTP狀態碼: 200
DNS解析時間: 16.00 ms
建立連線時間: 62.00 ms
準備傳輸時間: 62.00 ms
傳輸開始時間: 109.00 ms
傳輸結束總時間: 281.00 ms
下載資料包大小: 112563 bytes/s
HTTP頭部大小: 989 byte
平均下載速度: 112563 bytes/s
檢視獲取的檔案頭部及頁面內容檔案content.txt,如下圖所示