纔開始學習的時候有點忽略了這個模塊,以爲既然Python3提供了requests庫,爲何畫蛇添足學習這個模塊。後來才發現pycurl在探測Web服務器的時候的強大。html
pycurl是一個用c語言寫的libcurl Python實現,支持的操做協議有FTP,HTTP,HTTPS,TELNET等,能夠理解成linux下curl命令功能的python封裝。經過調用pycurl提供的方法,實現探測Web服務質量的狀況,好比響應的HTTP狀態碼,請求延時,HTTP頭信息,下載速度等,利用這些信息能夠定位服務響應卡頓緩慢的具體環節。python
安裝使用命令:pip install pycurl,若是下載失敗參考我上一篇總結的安裝方法。linux
模塊經常使用方法的說明:https://curl.haxx.se/libcurl/c/libcurl-tutorial.html緩存
pycurl.Curl()類實現建立一個libcurl包的Curl句柄對象,無參數。更多介紹libcurl包的介紹見:服務器
下面介紹Curl對象幾個經常使用的方法:運維
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文件對象
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頭部大小
實踐:實現探測Web服務質量curl
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響應頭部及頁面內容。
import os,sys import time import pycurl URL = "www.baidu.com" #探測的目標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.MAXREDIRS,1) #指定HTTP重定向的最大數爲1 c.setopt(pycurl.FORBID_REUSE,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.WRITEHEADER,indexfile) #將返回的HTTP HEADER定向到indexfile文件 c.setopt(pycurl.WRITEDATA,indexfile) #將返回的HTML內容定向到indexfile文件 try: c.perform() except: print("鏈接錯誤") 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" % NAMELOOKUP_TIME) print("創建鏈接時間:%2f" % CONNECT_TIME) print("準備傳輸時間:%2f" % PRETRANSFER_TIME) print("傳輸開始時間:%2f" % STARTTRANSFER_TIME) print("傳輸結束總時間:%2f" % TOTAL_TIME) print("下載數據包大小:%d bytes/s" % SIZE_DOWNLOAD) print("HTTP頭部大小:%d bytes/s" % HEADER_SIZE) print("平均下載速度:%d bytes/s" % SPEED_DOWNLOAD) #關閉文件及Curl對象 indexfile.close() c.close()
代碼來自<<Python 自動化運維>>這本書。
代碼執行結果:
查看獲取的HTTP文件頭部及頁面內容文件content.txt