1.模塊介紹
pycurl(http://pycurl.sourceforge.net)是一個用C語言寫的libcurl Python實現,功能非常強大,支持的操作協議有FTP、HTTP、HTTPS、 TELNET等,可以理解成Linux下curl命令功能的Python封裝,簡單易 用。本節通過調用pycurl提供的方法,實現探測Web服務質量的情況, 比如響應的HTTP狀態碼、請求延時、HTTP頭信息、下載速度等,利用 這些信息可以定位服務響應慢的具體環節,下面詳細進行說明
2.模塊常用方法說明
pycurl.Curl()類實現創建一個libcurl包的Curl句柄對象,無參 數。更多關于libcurl包的介紹見http://curl.haxx.se/libcurl/c/libcurltutorial.html。
下面介紹Curl對象幾個常用的方法。?
·close()方法,對應libcurl包中的curl_easy_cleanup方法,無參 數,實現關閉、回收Curl對象。
·perform()方法,對應libcurl包中的curl_easy_perform方法,無參 數,實現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服務質量的目的。
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響應頭部及頁面內容。實現源碼如下:
【/home/test/pycurl/simple1.py】
?
# _*_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()
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
