標籤:下載速度 web python 服務品質
pycurl是一個用C語言寫的libcurl Python實現,功能非常強大,支援的操作協議後FTP、HTTP、HTTPS、TELNET等,可以理解成Linux下curl命令功能的Python封裝,簡單易用
本例通過調用pycurl提供的方法,實現探測Web服務品質的情況,比如響應HTTP狀態代碼、請求延時、HTTP頭資訊、下載速度等,利用這些資訊可以定位服務響應慢的具體環節。
pycurl.Curl()類實現建立一個libcurl包的Curl控制代碼對象,無參數。
close()方法,對應的libcurl包中的curl_easy_cleanup方法,無參數,實現關閉、回收Curl對象。
perform()方法,對應libcurl包中的curl_easy_perform方法,無參數,實現Curl對象請求的提交。
setopt(option,value)方法,對應libcurl包中的curl_easy_setopt方法,參數option是通過libcurl的常量來指定的,參數value的值依賴option,可以是一個字串、整型、長整型、檔案對象、列表或函數等
安裝pycurl模組
[[email protected] ~]# python3 -m easy_install -i http://pypi.douban.com/simple/ pycurl
報錯:
setuptools.sandbox.UnpickleableException: ConfigurationError("Could not run curl-config: [Errno 2] No such file or directory: ‘curl-config‘",)
先安裝libcurl-devel解決:
[[email protected] ~]# yum -y install libcurl-devel[[email protected] ~]# python3 -m easy_install -i http://pypi.douban.com/simple/ pycurlFinished processing dependencies for pycurl
#!/usr/bin/python3# _*_ coding:utf-8 _*_import sys,osimport timeimport pycurlurl = "http://fm.mykurol.com" #探測的目標URLc = 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重新導向的最大數為1c.setopt(pycurl.DNS_CACHE_TIMEOUT,30) #設定儲存DNS資訊的時間為30秒#建立一個檔案對象,以"web"方式開啟,用來儲存返回的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 Exception as 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 bytes/s" % (HEADER_SIZE))print ("平均下載速度:%d bytes/s" % (SPEED_DOWNLOAD))#關閉檔案及curl對象indexfile.close()c.close()
執行結果:
HTTP狀態代碼:200DNS解析時間:17.44 ms建立連線時間:17.88 ms準備傳輸時間:17.89 ms傳輸開始時間:39.79 ms傳輸結束總時間:39.88 ms下載資料包大小:2526 bytes/sHTTP頭部大小:389 bytes/s平均下載速度:63333 bytes/s
查看擷取的HTTP檔案頭部及頁面內容content.txt
HTTP/1.1 200 OKDate: Fri, 09 Jun 2017 03:01:46 GMTServer: Apache/2.2.15 (CentOS)X-Powered-By: PHP/5.3.3Set-Cookie: PHPSESSID=qmhmq2hkbb3v5hs67rf38c5006; path=/Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cacheContent-Length: 2526Connection: closeContent-Type: text/html; charset=UTF-8 <!doctype html><link href="css.css" rel="stylesheet" type="text/css" /><title>MyKurol電影推薦網</title><link rel="icon" href="image/logo.ico" type="img/x-ico" /><body><link rel="icon" href="image/logo.ico" type="img/x-ico" /><div class="in"> <div class="header"> <div class="mykurol"> <a href="index.php" class="biaoyu"><strong>本網站由謝育政設計</strong></a> </div> <div class="key-sousuo"> <input type="text" name="mo_key" placeholder="電影/導演/演員"> <input type="submit" name="mo_sub" value="搜尋"> </div> <div class="Inlogin"> <a href="MovEncy.php" class="movie-ency">電影大全</a> <a href="#" class="movie-guess">猜一猜</a> <a href="#" class="movie-album">電影專輯</a> <a href="login.php" class="login-sub">登入</a><a href="reg.php" class="reg-sub">註冊</a> </div> </div></div><div style="z-index:999; position:absolute; right: 20px; bottom:40%"><div> <img src="image/1495501340.png" style="width:120px;"/> </div> <div style="padding:0; margin:0; background-color:#FFF; width:120px; height:30px"> <a style="color:#666; font-size:12px;">友情連結:<a href="http://www.mygdmec.cn" style="text-decoration:none; color:#F9F; font-size:12px">凡夢購物網</a> </div></div> <div class="body"> <div class="flo"> <div class="flo-biaoti"> <p href="#" class="movie-name" data-toggle="tooltip" title="《生化危機6》的詳細介紹"><strong>生化危機6</strong></p> <p class="movie-jieshao"> 在華盛頓特區愛麗絲被威斯克背叛後人類幾乎要失去最後的希望。作為唯一的倖存者,也是人類對抗殭屍大軍的最後防線,愛麗絲必須回到噩夢開始的地方——浣熊市。在那裡保護傘公司正在集結所有的力量企圖對殘餘的倖存者發起最後的打擊。<br> 導演:保羅·安德森<br> 主演:米拉·喬沃維奇 ,伊恩·格雷,艾麗·拉特,魯比·羅絲,李准基,肖恩·羅伯茨,威廉·利維,伊恩·馬肯 <br> 動作 / 驚悚 / 科幻 </p> </div> </div> </div> <div class="foot"> </div> </div></body>
本文出自 “謝育政” 部落格,請務必保留此出處http://kurolz.blog.51cto.com/11433546/1935054
Python學習筆記-實現探測Web服務品質