天天看點

python pycurl子產品詳解

文章目錄

  • ​​1. 介紹​​
  • ​​2. 安裝​​
  • ​​3. 類與方法​​
  • ​​4. 探索web服務品質​​

1. 介紹

pycurl是功能強大的python的url庫,是用c語言寫的,速度很快,比urllib和httplib都快。支援操作協定有​

​FTP, HTTP,HTTPS,TELNET​

​等,通過pycurl提供的方法,可以實作探測WEB服務品質的情況,比如,響應的HTTP狀态碼、請求延時、HTTP頭資訊、下載下傳速度等。

2. 安裝

第一種:

[root@localhost ~]$ pip install pycurl      

第二種:

yum install libcurl-devel

wget https://curl.haxx.se/download/curl-7.61.0.tar.gz

tar -zxvf curl-7.61.0.tar.gz

cd curl-7.61.0/

./configure 

make && make install

export LD_LIBRARY_PATH=/usr/local/lib      

3. 類與方法

  • close()方法:對應libcurl包中的curl_easy_cleanup方法,無參數,實作關閉,回收,curl對象。
  • perform()方法:對應lib包中的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頭部大小      

4. 探索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響應頭部及頁面内容.

第一種方法:

#!/usr/bin/python
# -*- coding:UTF-8 -*-
import os, sys
import time
import pycurl
 
#探測的目标URL
URL= "http://www.baidu.com"
#建立一個Curl對象
c = pycurl.Curl()
 
#定義請求的URL常量
c.setopt(pycurl.URL, URL)
#定義請求連接配接的等待時間
c.setopt(pycurl.CONNECTTIMEOUT, 5)
#定義請求逾時時間
c.setopt(pycurl.TIMEOUT, 5)
#屏蔽下載下傳進度條
c.setopt(pycurl.NOPROGRESS, 1)
#完成互動後強制斷開連接配接,不重用
c.setopt(pycurl.FORBID_REUSE, 1)
#指定HTTP重定向的最大數為1
c.setopt(pycurl.MAXREDIRS, 1)
#設定儲存DNS資訊的時間為30秒
c.setopt(pycurl.DNS_CACHE_TIMEOUT, 30)
#建立一個檔案對象,以“wb”方式打開,用來存儲傳回的http頭部及頁面内容
indexfile = open(os.path.dirname(os.path.realpath(__file__)) + "/content.txt", "wb")
#将傳回的HTTP HEADER定向到indexfile檔案
c.setopt(pycurl.WRITEHEADER, indexfile)
#将傳回的HTML内容定向到indexfile檔案對象
c.setopt(pycurl.WRITEDATA, indexfile)
try:
    #送出請求
    c.perform()
except Exception, e:
    print "connection error: " + str(e)
    indexfile.close()
    c.close()
    sys.exit()
    
#擷取DNS解析時間
NAMELOOKUP_TIME = c.getinfo(c.NAMELOOKUP_TIME)
#擷取建立連接配接時間
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狀态碼
HTTP_CODE = c.getinfo(c.HTTP_CODE)
#擷取下載下傳資料包大小
SIZE_DOWNLOAD = c.getinfo(c.SIZE_DOWNLOAD)
#擷取HTTP頭部大小
HEADER_SIZE = c.getinfo(c.HEADER_SIZE)
#擷取平均下載下傳速度
SPEED_DOWNLOAD = c.getinfo(c.SPEED_DOWNLOAD)
#列印輸出相關資料
print "HTTP狀态碼: %d" % (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()      
[root@localhost pycurl]# python pycurl1.py
HTTP狀态碼: 200
DNS解析時間: 62.75 ms
建立連接配接時間: 105.37 ms
準備傳輸時間: 105.51 ms
傳輸開始時間: 150.22 ms
傳輸結束總時間: 340.06 ms
下載下傳資料包大小: 237288 bytes/s
HTTP頭部大小: 1208 byte
平均下載下傳速度: 697774 bytes/s      

檢視擷取的檔案頭部及頁面内容檔案content.txt,如下圖所示

[root@localhost pycurl]# ls
content.txt  pycurl1.py
[root@localhost pycurl]# head -n 20  content.txt 
HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0x80504cae000d2c9b
Cache-Control: private
Connection: keep-alive
Content-Type: text/html;charset=utf-8
Date: Thu, 16 Apr 2020 03:45:00 GMT
Expires: Thu, 16 Apr 2020 03:44:32 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: BWS/1.1
.........................      
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2016/10/18 9:50
# @Author  : Beam
# @Site    : 實作探測Web服務品質
# @File    : demo_pycurl.py
# @Software: PyCharm
import pycurl
import os,sys,time
def getInfo(URL):
    """
    :param URL:使用者輸入需要檢測的URL位址
    info 字典主要用于映射dic字典
    dic字典主要存下curl結果
    :return:沒return,直接print,函數可以改寫,可以用于定時檢測多個域名,增加一個需要檢測的url清單即可
    """
    c = pycurl.Curl()
    c.setopt(pycurl.URL,URL) #定義請求的URL常量
    c.setopt(pycurl.CONNECTTIMEOUT,5) #請求等待時間最多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秒
    c.setopt(pycurl.USERAGENT,"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 OPR/40.0.2308.81 (Edition Baidu)")
    dic = {}
    info ={'NAMELOOKUP_TIME':'DNS解析時間','CONNECT_TIME':'建立連接配接時間','PRETRANSFER_TIME':'建立到準備傳輸所消耗的時間','STARTTRANSFER_TIME':'建立連接配接到傳輸開始消耗的時間','TOTAL_TIME':'傳輸總時間',
           'HTTP_CODE':'HTTP狀态碼','SIZE_DOWNLOAD':'下載下傳資料包大小','HEADER_SIZE':'HTTP頭部大小','SPEED_DOWNLOAD':'平均下載下傳速度'}
    with open(os.path.dirname(os.path.realpath(__file__))+"/content.txt","wb") as indexfile:
        c.setopt(pycurl.WRITEHEADER,indexfile)   #将傳回的HTTP HEADER定向到indexfile檔案對象
        c.setopt(pycurl.WRITEDATA,indexfile)     #将傳回的HTML内容定向到indexfile檔案對象
        try:
            c.perform()
        except Exception,e:
            print "Connection error:" +str(e)
            c.close()
            sys.exit()
        dic['NAMELOOKUP_TIME'] = '%.2f ms' % (c.getinfo(c.NAMELOOKUP_TIME)*1000)     #擷取DNS解析時間
        dic['CONNECT_TIME'] = '%.2f ms' % (c.getinfo(c.CONNECT_TIME)*1000)          #擷取建立連接配接時間
        dic['PRETRANSFER_TIME'] = '%.2f ms' % (c.getinfo(c.PRETRANSFER_TIME)*1000)  #擷取從建立到準備傳輸所消耗的時間
        dic['STARTTRANSFER_TIME'] = '%.2f ms' % (c.getinfo(c.STARTTRANSFER_TIME)*1000)  #擷取從建立連接配接到傳輸開始消耗的時間
        dic['TOTAL_TIME'] = '%.2f ms' % (c.getinfo(c.TOTAL_TIME)*1000)              #擷取傳輸總時間
        dic['HTTP_CODE'] = c.getinfo(c.HTTP_CODE)                #擷取HTTP狀态碼
        dic['SIZE_DOWNLOAD'] = '%d bytes/s' % (c.getinfo(c.SIZE_DOWNLOAD))        #擷取下載下傳資料包大小
        dic['HEADER_SIZE'] = '%d bytes/s' % (c.getinfo(c.HEADER_SIZE))            #擷取HTTP頭部大小
        dic['SPEED_DOWNLOAD'] = '%d bytes/s' % (c.getinfo(c.SPEED_DOWNLOAD))      #擷取平均下載下傳速度
    for key in info:
        print info[key],':',dic[key]
def main():
    while True:
        URL = raw_input("請輸入一個URL位址(Q for exit):")
        if URL.lower() == 'q':
            sys.exit()
        else:
            getInfo(URL)
if __name__ == '__main__':
    main()      
[root@localhost pycurl]# python pycurl2.py
請輸入一個URL位址(Q for exit):http://baidu.com
Connection error:(52, 'Empty reply from server')
[root@localhost pycurl]# python pycurl2.py
請輸入一個URL位址(Q for exit):http://www.baidu.com
傳輸總時間 : 306.28 ms
建立連接配接到傳輸開始消耗的時間 : 168.19 ms
平均下載下傳速度 : 679439 bytes/s
建立到準備傳輸所消耗的時間 : 107.48 ms
下載下傳資料包大小 : 208096 bytes/s
DNS解析時間 : 63.36 ms
建立連接配接時間 : 107.29 ms
HTTP頭部大小 : 1209 bytes/s
HTTP狀态碼 : 200
請輸入一個URL位址(Q for exit):