python運維開發經常使用模塊(7)web探測模塊pycurl

1.模塊介紹

pycurl(http://pycurl.sourceforge.net)是一個用C語言寫的libcurl Python實現,功能很是強大,支持的操做協議有FTP、HTTP、HTTPS、 TELNET等,能夠理解成Linux下curl命令功能的Python封裝,簡單易 用。本節經過調用pycurl提供的方法,實現探測Web服務質量的狀況, 好比響應的HTTP狀態碼、請求延時、HTTP頭信息、下載速度等,利用 這些信息能夠定位服務響應慢的具體環節,下面詳細進行說明html

2.模塊經常使用方法說明

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

3.實踐:實現探測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響應頭部及頁面內容。實現源碼以下: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()

相關文章
相關標籤/搜索