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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

