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()

python运维开发常用模块(7)web探测模块pycurl的更多相关文章

  1. python运维开发常用模块(一)psutil

    1.模块简介 psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻 松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网 络等)信息.它主 ...

  2. python运维开发常用模块(四)文件对比模块difflib

    1.difflib介绍 difflib作为 Python的标准库模块,无需安装,作用是对比文本之间的差异,且支持 输出可读性比较强的HTML文档,与Linux下的diff命令相似.我们可以 使用dif ...

  3. python运维开发常用模块(8)EXCEL操作模块XlsxWriter

    1.excel介绍 Excel是当今最流行的电子表格处理软件,支持丰富的计算函数及 图表,在系统运营方面广泛用于运营数据报表,比如业务质量.资源利 用.安全扫描等报表,同时也是应用系统常见的文件导出格 ...

  4. python运维开发常用模块(6)发送电子邮件模块smtplib

    1.模块常用方法 SMTP类定义:smtplib.SMTP([host[,port[,local_hostname[, timeout]]]]),作为SMTP的构造函数,功能是与smtp服务器建立连接 ...

  5. python运维开发常用模块(三)DNS处理模块dnspython

    1.dnspython模块介绍: dnspython(http://www.dnspython.org/)是Python实现的一个DNS 工具包,它支持几乎所有的记录类型,可以用于查询.传输并动态更新 ...

  6. python运维开发常用模块(5)文件目录对比模块filecmp

    1.filecmp模块介绍 当我们进行代码审计或校验备份结果时,往往需要检查原始与目 标目录的文件一致性,Python的标准库已经自带了满足此需求的模块 filecmp.filecmp可以实现文件.目 ...

  7. python运维开发常用模块(二)IPy

    1.安装 IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直 接影响路由协议算法的效率,包括网络性能.可扩展性等方面,在这个 过程当中,免不了要计算大量的IP地址,包括网段.网络掩码.广播地 ...

  8. Python运维开发基础03-语法基础 【转】

    上节作业回顾(讲解+温习60分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen #只用变量和字符串+循环实现“用户登陆 ...

  9. Python运维开发基础01-语法基础【转】

    开篇导语 整个Python运维开发教学采用的是最新的3.5.2版,当遇到2.x和3.x版本的不同点时,会采取演示的方式,让同学们了解. 教学预计分为四大部分,Python开发基础,Python开发进阶 ...

随机推荐

  1. 什么是SFP光模块?

    什么是光模块? 光模块(optical module)由光电子器件.功能电路和光接口等组成,光电子器件包括发射和接收两部分.简单的说,光模块的作用就是光电转换,发送端把电信号转换成光信号,通过光纤传送 ...

  2. Java开发桌面程序学习(四)——常用应用布局模板和简单分析

    布局 前言 刚开始的时候,不知道使用什么布局,发现SceneBuilder其实有8.5版本的,里面就是有提供一个简单的桌面程序模板,8.5可以去官网下载,不过网速好像有点慢,慢慢等吧,官网下载地址 布 ...

  3. 认识Metasploit框架

    Metasploit基础 认识Metaspliot框架 ​ Metaspliot(MSF)渗透测试框架,提供众多的接口.选项.变量.模块以供渗透工作人员使用它完成一系列的渗透攻击. 渗透攻击(Expl ...

  4. ubuntu下查看本机IP地址

    在终端输入: ifconfig -a 即可得解.出来的结果inet后就是你的ip地址

  5. 版本管理·玩转git(推到远程仓库)

    经过前面的练习,你在本地的仓库里管理代码已经比较熟练了,但如果是团队开发呢,如何配合起来呢? 我们可以把版本仓库放在互联网上,开发者把自己最新的版本推到线上仓库,同时,把线上仓库的最新代码拉到自己本地 ...

  6. SQL Server Alwayson 主从数据库账号同步

    我们建立了Alwayson后,辅助副本下的数据库是没有相应的账号的,怎么样进行账号的同步呢?怎么在不知道密码的情况下,进行账号的同步设置. 我们可以通过SP--sp_help_revlogin 来实现 ...

  7. django前奏

    目录 前言 web框架本质 服务器程序和应用程序 python三大主流web框架 django flask torndao Django安装配置 注意事项 命令行创建项目 app的概念 pycharm ...

  8. 封装查找元素以及集成日志输出,Base模块

    关于查找元素封装,Base模块 """ Selenium 封装基类 封装查找元素以及集成日志输出 """ from HTMLReport i ...

  9. I2C硬件与模拟的区别

    硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C:一般也较为稳定,但是程序较为繁琐. 硬件(固件)I2C是直接调用内部寄存器进行 ...

  10. PyCharm2019.3专业版激活

    1. 首先到官网下载Professional(专业版),链接地址: https://www.jetbrains.com/pycharm/download/ 具体安装方法这里就不赘述 2. 下载补丁je ...