断断续续自学python已经几个月了,但是没啥实质性的进展,特别是不常用,加上到面向对象之后,人都是晕晕的,这不是被迫要写一个案例嘛!实现将产生的数据插入到execl中去,但是是追加的方式,而不是覆盖,然后算出平均值和插入图表,最开始之前参考别人写的文章用xlsxwriter模块,但是后来发现这个只能一次性写入,数据会覆盖,所以弃之,用了xlrd和xlwt模块。虽然暂时只实现了数据能追加写到execl中。
需求:一般我们选一个IDC机房,大多数的办法是用ping的方式去测试,但是这只能从icmp得出结果,我们试想一下除了icmp是不是还可以从tcp获取结果呢?主要是探测web服务质量,用cron每小时去执行一次python脚本,然后将产生的数据按系统当前时间插入到execl表中去分析结果。相当于做一个网络方面的测试。下面是一段代码主要是参考某人的书籍中。
#!/usr/bin/python
#coding=utf-8
import os,sys
import time
import pycurl
import xlrd
import xlwt
import xlutils
from xlrd import open_workbook
from xlutils.copy import copy
URL="http://www.baidu.com"
now = time.strftime('%H%M%S')
n = int(now[:2])
c = pycurl.Curl()
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)
c.setopt(pycurl.MAXREDIRS, 1)
c.setopt(pycurl.DNS_CACHE_TIMEOUT, 30)
indexfile = open(os.path.dirname(os.path.realpath(__file__))+"/content.txt","wb")
c.setopt(pycurl.WRITEHEADER, indexfile)
c.setopt(pycurl.WRITEDATA, 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)
CONNECT_TIME = c.getinfo(c.CONNECT_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" %(TOTAL_TIME*1000)
print "下载数据包大小: %d bytes/s" %(SIZE_DOWNLOAD)
print "HTTP头部大小: %d byte" %(HEADER_SIZE)
print "平均下载速度: %d bytes/s" %(SPEED_DOWNLOAD)
indexfile.close()
c.close()
下面开始是我自己写的代码,可优化空间太大,作为一个初学者来说。请大家勿吐槽啊!
N = (0,1,2,3,4,5,6,7)
L = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)
H = (00,01,02,03,04,05,06,07,'08','09',10,11,12,13,14,15,16,17,18,19,20,21,22,23)
if not os.path.exists('chart.xlsx'):
w = xlwt.Workbook()
sheet = w.add_sheet('chart.xlsx')
w.save('chart.xlsx')
rb = open_workbook('chart.xlsx')
wb = copy(rb)
sheet = wb.get_sheet(0)
sheet.write(N[0], L[0], URL)
sheet.write(N[0], L[1], H[0])
sheet.write(N[0], L[2], H[1])
sheet.write(N[0], L[3], H[2])
sheet.write(N[0], L[4], H[3])
sheet.write(N[0], L[5], H[4])
sheet.write(N[0], L[6], H[5])
sheet.write(N[0], L[7], H[6])
sheet.write(N[0], L[8], H[7])
sheet.write(N[0], L[9], H[8])
sheet.write(N[0], L[10], H[9])
sheet.write(N[0], L[11], H[10])
sheet.write(N[0], L[12], H[11])
sheet.write(N[0], L[13], H[12])
sheet.write(N[0], L[14], H[13])
sheet.write(N[0], L[15], H[14])
sheet.write(N[0], L[16], H[15])
sheet.write(N[0], L[17], H[16])
sheet.write(N[0], L[18], H[17])
sheet.write(N[0], L[19], H[18])
sheet.write(N[0], L[20], H[19])
sheet.write(N[0], L[21], H[20])
sheet.write(N[0], L[22], H[21])
sheet.write(N[0], L[23], H[22])
sheet.write(N[0], L[24], H[23])
sheet.write(N[0], L[25], u'平均值')
sheet.write(N[1], L[0], u'HTTP状态码')
sheet.write(N[2], L[0], u'DNS解析时间')
sheet.write(N[3], L[0], u'建立连接时间')
sheet.write(N[4], L[0], u'传输结束总时间')
sheet.write(N[5], L[0], u'下载数据包大小')
sheet.write(N[6], L[0], u'HTTP头部大小')
sheet.write(N[7], L[0], u'平均下载速度')
wb.save('chart.xlsx')
if n == 0:
rb = open_workbook('chart.xlsx')
wb = copy(rb)
sheet = wb.get_sheet(0)
sheet.write(N[1], L[1], HTTP_CODE)
sheet.write(N[2], L[1], NAMELOOKUP_TIME*1000)
sheet.write(N[3], L[1], CONNECT_TIME*1000)
sheet.write(N[4], L[1], TOTAL_TIME*1000)
sheet.write(N[5], L[1], SIZE_DOWNLOAD)
sheet.write(N[6], L[1], HEADER_SIZE)
sheet.write(N[7], L[1], SPEED_DOWNLOAD)
wb.save('chart.xlsx')
elif n == 1:
rb = open_workbook('chart.xlsx')
wb = copy(rb)
sheet = wb.get_sheet(0)
sheet.write(N[1], L[2], HTTP_CODE)
sheet.write(N[2], L[2], NAMELOOKUP_TIME*1000)
sheet.write(N[3], L[2], CONNECT_TIME*1000)
sheet.write(N[4], L[2], TOTAL_TIME*1000)
sheet.write(N[5], L[2], SIZE_DOWNLOAD)
sheet.write(N[6], L[2], HEADER_SIZE)
sheet.write(N[7], L[2], SPEED_DOWNLOAD)
wb.save('chart.xlsx')
......此刻省去了很多行,因为都是一样,只需要将==递增就行,然后L[X]中的值也是递增。
elif n == 23:
rb = open_workbook('chart.xlsx')
wb = copy(rb)
sheet = wb.get_sheet(0)
sheet.write(N[1], L[24], HTTP_CODE)
sheet.write(N[2], L[24], NAMELOOKUP_TIME*1000)
sheet.write(N[3], L[24], CONNECT_TIME*1000)
sheet.write(N[4], L[24], TOTAL_TIME*1000)
sheet.write(N[5], L[24], SIZE_DOWNLOAD)
sheet.write(N[6], L[24], HEADER_SIZE)
sheet.write(N[7], L[24], SPEED_DOWNLOAD)
wb.save('chart.xlsx')
else:
print '数据插入错误!'
最后我们用crontab每整点运行一次脚本。就可以看到数据啦!
下面大家看一下效果图啊!
需要改进的地方:
1、产生的excel文件肯定需要加上每天日期命名,并且是每天创建一个。
2、这个模块不知道如何求平均值。
3、不会插入图表。
这些问题争取在下一篇博客中解决哈!