最近运维还是比较空闲,写篇自己的心得体会。做过运维的应该都做过http服务了。像一些电子商城,或者是一些互联网公司,web的服务之类是至关重要的,近期看了刘天斯大哥的书觉得自己运维平台应该也可以这样去监控服务之类,今天学习了pycurl模块,这里记录一下:
模块相关说明: 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头部大小 javascript教程 http://www.17javascript.com/
好了通过上面的思路,我们写一个脚本来完成这个工作就好了: 直接代码: #!/usr/bin/env python # -*- coding: utf-8 -*- import os,sys import time import sys import pycurl
class Test: def __init__(self): self.contents = '' def callback(self,curl): self.contents = self.contents + curl def test_gzip(url): t = Test() c = pycurl.Curl() c.setopt(pycurl.WRITEFUNCTION,t.callback) c.setopt(pycurl.ENCODING, 'gzip') c.setopt(pycurl.URL,input_url) c.perform() 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_CODE = c.getinfo(c.HTTP_CODE) SIZE_DOWNLOAD = c.getinfo(c.SIZE_DOWNLOAD) HEADER_SIZE = c.getinfo(c.HEADER_SIZE) 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) if __name__ == '__main__': url = sys.argv[1] test_gzip(url)
#备注,上面之所以写一个类的函数,就是因为,pycurl.WRITEFUNCTION这里我们定义的是返回一个函数,然后我们给一个空的函数就好了,原先试过生成文件结果生成不了。