首次体验用Python,有很多不适应的地方,时不时会和C#、PB等语言的语法混淆。作为数据处理工具,使用其你会不断有惊喜,有其它编程语言基础的情况下,上手比较快。
下面这个程序代码用了大概半天时间,其实要实现的功能很简单,原来有个页面的数据需要完整的展示到另外一个设备上,但分辨率和尺寸不符, 找原厂需要很多费用,不忍心发扬自力更生精神,自己动手丰衣足食。
分析原数据页面数据刷新机制,采用ajax技术推送数据。
可构造JSON以POST方式访问该服务。用postman模拟发送,成功获取数据。
展示页面使用HTML格式,定义模板,变量赋值后进行替换,最后输出文件保存。具体细节不再赘述,完整代码如下:
# -*- coding: utf-8 -*-
"""
作者:aloxy
日期:2019年10月10日
版本:1.0
#打包EXE: pyinstaller getsis.py -F -c
#
"""
import json
import requests
import datetime
import os
import time
"""
HTML文件模板
"""
class Template_mixin(object):
"""html文件"""
HTML_TMPL = r"""
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="GB2312">
<meta http-equiv="content-type" content="text/html; charset=GB2312">
<meta name="renderer" content="webkit"/>
<meta name="force-rendering" content="webkit"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta HTTP-EQUIV="Pragma" content="no-cache">
<meta HTTP-EQUIV="Cache-Control" content="no-cache">
<meta HTTP-EQUIV="Expires" content="0">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<title>****环保指标</title>
<link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
<div align='center'><h1 style="font-weight: bold;font-size: 42px;font-family: Microsoft YaHei;color:#00FF00;text-shadow: 1px 1px 1px #FFFFFF;letter-spacing:8px"><br>****公司环保指标<br></h1></div>
<div align='right' style="padding-right:150px;color:#FFFFFF;font-weight: bold;font-size: 24px;"><p class='attribute'><strong>%(value)s</strong></p></div>
<style type="text/css" media="screen">
body { font-family: Microsoft YaHei,Tahoma,arial,helvetica,sans-serif;padding: 10px;color:#FFFFFF}
table {
border-collapse: collapse;
}
table, td, th {
border: 1px solid #FFFFFF;
vertical-align: middle;
text-align: center;
}
</style>
</head>
<body style="margin: 0px; border: 0px dotted red; border-image: none; background-color: rgb(0, 0, 255);">
<table id='result_table' class="table;table-layout:fixed;" width="1200" height="586">
<tr align='center' valign='middle' style="font-weight: bold;font-size: 24px;" height="41">
<th style="vertical-align: middle;text-align: center;width:300" rowspan=2><div>排放指标</div></th>
<th colspan=2 style="vertical-align: middle;text-align: center;width:222" >1号机组</th>
<th colspan=2 style="vertical-align: middle;text-align: center;width:222" >2号机组</th>
<th colspan=2 style="vertical-align: middle;text-align: center;width:222" >3号机组</th>
<th colspan=2 style="vertical-align: middle;text-align: center;width:222" >4号机组</th>
</tr>
<tr style="font-weight: bold;font-size: 24px;" height="41">
<td style="vertical-align: middle;text-align: center;width:111">实时值</td>
<td style="vertical-align: middle;text-align: center;width:111">标准值</td>
<td style="vertical-align: middle;text-align: center;width:111">实时值</td>
<td style="vertical-align: middle;text-align: center;width:111">标准值</td>
<td style="vertical-align: middle;text-align: center;width:111">实时值</td>
<td style="vertical-align: middle;text-align: center;width:111">标准值</td>
<td style="vertical-align: middle;text-align: center;width:111">实时值</td>
<td style="vertical-align: middle;text-align: center;width:111">标准值</td>
</tr>
%(table_tr)s
</table>
<script language="JavaScript">
function myrefresh(){
window.location.reload();
}
setTimeout('myrefresh()',5000); //指定5秒刷新一次
</script>
</body>
</html>"""
TABLE_TMPL = """
<tr align='center' valign='middle' style="vertical-align: middle;text-align: center;font-weight: bold;font-size: 24px;" height="41">
<td style="vertical-align: middle;text-align: center;width:300">机组负荷(MW)</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_1)s</td>
<td style="vertical-align: middle;text-align: center;width:111">320</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_2)s</td>
<td style="vertical-align: middle;text-align: center;width:111">320</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_3)s</td>
<td style="vertical-align: middle;text-align: center;width:111">300</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_4)s</td>
<td style="vertical-align: middle;text-align: center;width:111">300</td>
</tr>
<tr align='center' valign='middle' style="vertical-align: middle;text-align: center;font-weight: bold;font-size: 24px;" height="41">
<td style="vertical-align: middle;text-align: center;width:300">二氧化硫(mg/m<sup>3</sup>)</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_5)s</td>
<td style="vertical-align: middle;text-align: center;width:111">200</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_6)s</td>
<td style="vertical-align: middle;text-align: center;width:111">200</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_7)s</td>
<td style="vertical-align: middle;text-align: center;width:111">200</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_8)s</td>
<td style="vertical-align: middle;text-align: center;width:111">200</td>
</tr>
<tr align='center' valign='middle' style="vertical-align: middle;text-align: center;font-weight: bold;font-size: 24px;" height="41">
<td style="vertical-align: middle;text-align: center;width:300">氮氧化物(mg/m<sup>3</sup>)</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_9)s</td>
<td style="vertical-align: middle;text-align: center;width:111">200</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_10)s</td>
<td style="vertical-align: middle;text-align: center;width:111">200</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_11)s</td>
<td style="vertical-align: middle;text-align: center;width:111">200</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_12)s</td>
<td style="vertical-align: middle;text-align: center;width:111">200</td>
</tr>
<tr align='center' valign='middle' style="vertical-align: middle;text-align: center;font-weight: bold;font-size: 24px;" height="41">
<td style="vertical-align: middle;text-align: center;width:300">粉尘(mg/m<sup>3</sup>)</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_13)s</td>
<td style="vertical-align: middle;text-align: center;width:111">30</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_14)s</td>
<td style="vertical-align: middle;text-align: center;width:111">30</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_15)s</td>
<td style="vertical-align: middle;text-align: center;width:111">30</td>
<td style="vertical-align: middle;text-align: center;width:111">%(hb_16)s</td>
<td style="vertical-align: middle;text-align: center;width:111">30</td>
</tr>"""
"""
构造POST请求头,访问WEB服务获取数据
"""
def get_html_text(url):
values_json ={"p": "0"}
headers ={
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"Host": "1.1.1.89:8888",
#"Referer": "http://1.1.1.89:8888/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
"content-type":"application/json"
}
r = requests.post(url,timeout=30, headers = headers,data = json.dumps(values_json).encode("utf-8"))
return r.text
"""
处理从WEB服务获取的数据
"""
def gethtml():
html = Template_mixin()
#获取服务器数据
url_get = 'http://1.1.1.89:8888/abc.asmx/get_data'
text = get_html_text(url_get)
#将获取的字符串转换为数组
text = text.replace("[","").replace("]","").replace("}","")
newtxt =[]
newtxt = str.split(text[6:len(text) - 1],",")
#填充页面数据单元格
table_td = html.TABLE_TMPL % dict(hb_1 = newtxt[0],hb_2 = newtxt[1],hb_3 = newtxt[2]
,hb_4 = newtxt[3],hb_5 = newtxt[4],hb_6 = newtxt[5],
hb_7 = newtxt[6],hb_8 = newtxt[7],hb_9 = newtxt[8],
hb_10 = newtxt[9],hb_11 = newtxt[10],hb_12 = newtxt[11],
hb_13 = newtxt[12],hb_14 = newtxt[13],hb_15 = newtxt[14],hb_16 = newtxt[15])
#获得当前时间
now = datetime.datetime.now() #这是时间数组格式
#转换为指定的格式:
#otherStyleTime = now.strftime("%F") # %H:%M:%S
otherStyleTimes = now.strftime("%Y/%m/%d %H:%M:%S") # %H:%M:%S
years = '年'
months = '月'
days = '日'
otherStyleTime = str(now.year) + years + str(now.month) + months + str(now.day) + days
output = html.HTML_TMPL % dict(value = otherStyleTime,table_tr = table_td,)
# 生成页面html代码
file_names = "hbzb.htm"
#获取路径,写本地HTML文件
filepath = os.path.join(os.path.split(os.path.realpath(__file__))[0],'report')
if os.path.exists(filepath) == False:
os.mkdir(filepath)
filename = os.path.join(filepath,file_names)
if os.path.exists(filename) == False:
open(filename,"x")
f = open(filename,"w")
f.write(output)
f.close()
print("系统信息:",otherStyleTimes,"数据已成功写入,hbzb.htm.")
"""
主函数
"""
def main():
#无限次循环,按Ctrl + C退出运行
while True:
gethtml()
time.sleep(5)
if __name__ == '__main__':
main()