使用pycurl实现探测Web服务质量

python struggling 1340次浏览 0个评论

pycurl(http://pycurl.sourceforge.net)是一个用C语言写的libcurl Python实现,速度很快,比urllib和httplib都快功能非常强大,支持的操作协议有FTP、HTTP、HTTPS、TELNET等,可以理解成Linux下curl命令功能的Python封装,简单易用。

下面介绍Curl对象的几个常用的方法:

close()方法,对应libcurl包中的curl_easy_cleanup方法,无参数,实现关闭、回收Curl对象。

perform()方法,对应libcurl包中的curl_easy_perform方法,无参数,实现Curl对象请求的提交。

setopt(option, value)方法,对应libcurl包中的curl_easy_setopt方法,参数option是通过libcurl的常量来指定的,参数value的值会依赖option,可以是一个字符串、整型、长整型、文件对象、列表或函数等。

getinfo(option)方法,对应libcurl包中的curl_easy_getinfo方法,参数option是通过libcurl的常量来指定的。

使用pycurl实现探测Web服务质量脚本:

<code>
#!/usr/bin/python
#coding:utf-8

import os,sys
import time
import pycurl

'''
    探测web服务质量
    www.tianfeiyu.com
'''
URL = 'http://www.tianfeiyu.com'   #探测的目标URL
c = pycurl.Curl()               #创建一个Curl对象
c.setopt(pycurl.URL,URL)        #定义请求的URL常量
c.setopt(pycurl.CONNECTTIMEOUT,10)   #定义请求的等待连接时间
c.setopt(pycurl.TIMEOUT,20)          #定义请求的超时时间
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(c.USERAGENT, 'Foo')

#创建一个文件对象,以‘wb’方式打开,用来存储返回的http头部及页面内容

indexfile = open(os.path.dirname(os.path.realpath(__file__))+'/content','wb')

#os.path.realpath(__file__) 返回指定的文件名真实路径,不使用任何符号链接。os.path.dirname返回文件路径

c.setopt(pycurl.WRITEHEADER,indexfile)  #将返回的HTTP HEADER定向到indefile文件对象
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()

</code>

运行结果:

<code>
[root@feiyu auto]# python web_check.py
HTTP状态码: 200
DNS解析状态:5055.88 ms
建立连接时间: 5100.66 ms
准备传输时间:5100.67 ms
传输开始时间:5581.72 ms
传输结束总时间:5627.53 ms
下载数据包大小:32662 bytes/s
HTTP 头部大小:248 bytes/s
平均下载速度:5803 bytes/s

[root@sta auto]# cat content   #查看http头部及页面内容
HTTP/1.1 200 OK
Date: Thu, 19 Nov 2015 10:28:24 GMT
Server: Apache/2.4.3 (Unix) OpenSSL/1.0.1e-fips
X-Powered-By: PHP/5.4.26
X-Pingback: http://www.tianfeiyu.com/xmlrpc.php
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

<!DOCTYPE HTML>
<html>
<head>

。。。。。。
。。。。。。
</code>

此脚本只是初步完成的,还在不断完善中,欢迎继续关注!



DevOps-田飞雨 》》转载请注明源地址
喜欢 (0)or分享 (0)
发表我的评论
取消评论
*

表情 贴图 加粗 链接 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址