pycurl(http://pycurl.sourceforge.net)是一個用C語言寫的libcurl Python實現,功能很是強大,支持的操做協議有FTP、HTTP、HTTPS、 TELNET等,能夠理解成Linux下curl命令功能的Python封裝,簡單易 用。本節經過調用pycurl提供的方法,實現探測Web服務質量的狀況, 好比響應的HTTP狀態碼、請求延時、HTTP頭信息、下載速度等,利用 這些信息能夠定位服務響應慢的具體環節,下面詳細進行說明html
pycurl.Curl()類實現建立一個libcurl包的Curl句柄對象,無參 數。更多關於libcurl包的介紹見http://curl.haxx.se/libcurl/c/libcurltutorial.html。python
下面介紹Curl對象幾個經常使用的方法。 緩存
·close()方法,對應libcurl包中的curl_easy_cleanup方法,無參 數,實現關閉、回收Curl對象。
·perform()方法,對應libcurl包中的curl_easy_perform方法,無參 數,實現Curl對象請求的提交。 ·curl
setopt(option,value)方法,對應libcurl包中的curl_easy_setopt方 法,參數option是經過libcurl的常量來指定的,參數value的值會依賴 option,能夠是一個字符串、整型、長整型、文件對象、列表或函數 等。下面列舉經常使用的常量列表:函數
c = pycurl.Curl() #建立一個curl對象 c.setopt(pycurl.CONNECTTIMEOUT, 5) #鏈接的等待時間,設置爲0則不等待 c.setopt(pycurl.TIMEOUT, 5) #請求超時時間 c.setopt(pycurl.NOPROGRESS, 0) #是否屏蔽下載進度條,非0則屏蔽 c.setopt(pycurl.MAXREDIRS, 5) #指定HTTP重定向的最大數 c.setopt(pycurl.FORBID_REUSE, 1) #完成交互後強制斷開鏈接,不重用 c.setopt(pycurl.FRESH_CONNECT,1) #強制獲取新的鏈接,即替代緩存中的鏈接 c.setopt(pycurl.DNS_CACHE_TIMEOUT,60) #設置保存DNS信息的時間,默認爲120秒 c.setopt(pycurl.URL,"http://www.baidu.com") #指定請求的URL c.setopt(pycurl.USERAGENT,"Mozilla/5.2 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50324)") #配置請求HTTP頭 的User-Agent c.setopt(pycurl.HEADERFUNCTION, getheader) #將返回的HTTP HEADER定向到回調函 數getheader c.setopt(pycurl.WRITEFUNCTION, getbody) #將返回的內容定向到回調函數getbody c.setopt(pycurl.WRITEHEADER, fileobj) #將返回的HTTP HEADER定向到fileobj 文件對象 c.setopt(pycurl.WRITEDATA, fileobj) #將返回的HTML內容定向到fileobj文件對象
·getinfo(option)方法,對應libcurl包中的curl_easy_getinfo方法, 參數option是經過libcurl的常量來指定的。下面列舉經常使用的常量列表:網站
c = pycurl.Curl() #建立一個curl對象 c.getinfo(pycurl.HTTP_CODE) #返回的HTTP狀態碼 c.getinfo(pycurl.TOTAL_TIME) #傳輸結束所消耗的總時間 c.getinfo(pycurl.NAMELOOKUP_TIME) #DNS解析所消耗的時間 c.getinfo(pycurl.CONNECT_TIME) #創建鏈接所消耗的時間 c.getinfo(pycurl.PRETRANSFER_TIME) #從創建鏈接到準備傳輸所消耗的時間 c.getinfo(pycurl.STARTTRANSFER_TIME) #從創建鏈接到傳輸開始消耗的時間 c.getinfo(pycurl.REDIRECT_TIME) #重定向所消耗的時間 c.getinfo(pycurl.SIZE_UPLOAD) #上傳數據包大小 c.getinfo(pycurl.SIZE_DOWNLOAD) #下載數據包大小 c.getinfo(pycurl.SPEED_DOWNLOAD) #平均下載速度 c.getinfo(pycurl.SPEED_UPLOAD) #平均上傳速度 c.getinfo(pycurl.HEADER_SIZE) #HTTP頭部大小
咱們利用libcurl包提供的這些常量值來達到探測Web服務質量的目的。google
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響應頭部及頁面內容。實現源碼以下:url
【/home/test/pycurl/simple1.py】spa
#_*_coding:utf-8_*_ #****************************************************************# # ScriptName: simple01.py # Author: BenjaminYang # Create Date: 2019-06-02 01:37 # Modify Author: BenjaminYang # Modify Date: 2019-06-02 01:37 # Function: #***************************************************************# #!/usr/bin/python import os,sys import time import pycurl URL="http://www.google.com.hk" #探測的目標URL c=pycurl.Curl() #建立一個Curl對象 c.setopt(pycurl.URL,URL) #定義請求的URL常量 c.setopt(pycurl.CONNECTTIMEOUT,5) #定義請求鏈接的等待時間 c.setopt(pycurl.TIMEOUT,5) #定義請求超時時間 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) #設置保存DNS信息的時間爲30秒 #建立一個文件對象,以」wb」方式打開,用來存儲返回的http頭部及頁面內容 indexfile=open(os.path.dirname(os.path.realpath(__file__))+"/content.txt","wb") c.setopt(pycurl.WRITEDATA,indexfile) #將返回的HTML內容定向到indexfile文件對象 try: c.perform() #提交請求 except Exception,e: print "connection error:"+str(e) indexfile.close() c.close() sys.exit() NAMELOOKUP_TIME=c.getinfo(c.NAMELOOKUP_TIME) #獲取DNS解析時間 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_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 "HTTP狀態碼:%s" %(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()