import requests
from bs4 import BeautifulSoup
import csv
import json
from pytz import timezone
from datetime import datetime
import time,threading
from filelog import writelog
from SqlServerDB import *
from PyQt5.QtWidgets import QMainWindow,QApplication, QTableWidgetItem, QMessageBox,QFileDialog,QTreeWidgetItem,QTextBrowser
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap,QIcon
from PyQt5.QtCore import QThread,pyqtSignal,QSize,QObject
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from chinaTime import *
class MySignals(QObject):
# 定义一种信号,两个参数 类型分别是: QTextBrowser 和 字符串
# 调用 emit方法 发信号时,传入参数 必须是这里指定的 参数类型
text_print = pyqtSignal(QTextBrowser,str)
# 还可以定义其他种类的信号
update_table = pyqtSignal(str)
global_ms = MySignals()
logfile_path = 'logs/'
logfile_name = logfile_path+getcurrentymd()+'.log'
bRunThree=True
with open("sysseting.json", 'r', encoding='utf-8') as fw:
injson = json.load(fw)
fw.close()
if 'DBHost' in injson:
dbhost= injson['DBHost']
else:
dbhost= '(local)'
if 'dbdatabase' in injson:
dbdatabase= injson['dbdatabase']
else:
dbdatabase='XJCSQ'
if 'dbpassword' in injson:
dbpassword = injson['dbpassword']
else:
dbpassword='Xmrbi123456@'
if 'dbuser' in injson:
dbuser= injson['dbuser']
else:
dbuser='xmrbijd'
def doGetQXData(mgui):
try:
if mgui:
global_ms.text_print.emit(mgui.textBrowser,getcurrenttimehm()+'准备获取气象数据...')
url='http://www.weather.com.cn/weather/101230201.shtml'
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
bs = BeautifulSoup(r.text, "html.parser")
body = bs.body
data = body.find('div', attrs={'class': 'con today clearfix'})
data = data.find('div', attrs={'class': 'c7d'})
# 下面获取7天的数据
ul = data.find('ul') # 找到所有的ul标签
li = ul.find_all('li') # 找到左右的li标签
i = 0 # 控制获取的天数
rsdata=''#'{"date":"","wea":"","tem_low":"","tem_high":"","windtitle":"","wind_scaleV":""}'
for day in li: # 遍历找到的每一个li
# print(day)
inf = day.find_all('p')
date = day.find('h1').string # 得到日期
date = date[0:date.index('日')] # 取出日期号
wea=inf[0].string
tem_low = inf[1].find('i').string # 找到最低气温
if inf[1].find('span') is None: # 天气预报可能没有最高气温
tem_high = None
else:
tem_high = inf[1].find('span').string # 找到最高气温
if tem_high[-1] == '℃':
tem_high=(tem_high[:-1])
if tem_low[-1] == '℃':
tem_low=(tem_low[:-1])
wind = inf[2].find_all('span') # 找到风向
for j in wind:
windtitle=(j['title'])
wind_scale = inf[2].find('i').string # 找到风级
# index1 = wind_scale.index('级')
# wind_scaleV=int(wind_scale[index1-1:index1])
sdate=getcurrentym()+"{:0>2s}".format(date)
rsdata='{"date":"'+sdate+'","wea":"'+wea+'","tem_low":"'+str(tem_low)+'","tem_high":"'+str(tem_high)+'","windtitle":"'+windtitle+'","wind_scaleV":"'+wind_scale+'"}'
# format(sdate,wea,tem_low,tem_high,windtitle,wind_scale)
# print(date,wea,tem_low,tem_high,windtitle,wind_scaleV)
break
if mgui:
global_ms.text_print.emit(mgui.textBrowser,getcurrenttimehm()+'获取气象数据 返回信息:{0}'.format(rsdata))
return rsdata
except Exception as ex:
if mgui:
global_ms.text_print.emit(mgui.textBrowser,getcurrenttimehm()+'准备获取气象数据接口报错{0}'.format(str(ex)))
writelog(logfile_name,"doGetQXData err:"+str(ex)+'\n')
return ''
def doGetHYData(mgui):
try:
if mgui:
global_ms.text_print.emit(mgui.textBrowser,getcurrenttimehm()+'准备获取海洋气象数据...')
hyurl='http://www.xmocean.com/HUXOF/html/t/dataCollectionAction.do?action=getseaareadata'
hyr=requests.post(hyurl)
hyjson=json.loads(hyr.text)
rsdata=''#'{"date":"","waveH":"","waveL":"","temperatureH":"","temperatureL":"","area":""}'
if 'resultObject' in hyjson:
for hyx in hyjson['resultObject']:
rsdata ='{"date":"'+str(hyx[0])+'","waveH":"'+str(hyx[1])+'","waveL":"'+str(hyx[2])+'","temperatureH":"'+str(hyx[3])+'","temperatureL":"'+str(hyx[4])+'","area":"'+hyx[5]+'"}'
# .format(hyx[0],hyx[1],hyx[2],hyx[3],hyx[4],hyx[5])
if mgui:
global_ms.text_print.emit(mgui.textBrowser,getcurrenttimehm()+'获取气象数据 返回信息:{0}'.format(rsdata))
return rsdata
except Exception as ex:
if mgui:
global_ms.text_print.emit(mgui.textBrowser,getcurrenttimehm()+'准备获取海洋气象数据接口报错{0}'.format(str(ex)))
writelog(logfile_name,"doGetHYData err:"+str(ex)+'\n')
return ''
def getWaveinfo(Avalue):
try:
rdata=''
if Avalue<0.1:
rdata='微浪'
elif Avalue<0.5:
rdata='小浪'
elif Avalue<1.25:
rdata='轻浪'
elif Avalue<2.5:
rdata='中浪'
elif Avalue<4:
rdata='大浪'
elif Avalue<6:
rdata='距浪'
elif Avalue<9:
rdata='狂浪'
elif Avalue<14:
rdata='狂涛'
else:
rdata='怒涛'
return rdata
except:
pass
def dostartThreeGetData(mgui):
try:
kwargsv=dict(host=dbhost,user=dbuser,password=dbpassword,database=dbdatabase)
conn=SQLServerDB(kwargsv)
bqxtoday=False
bhxtoday=True
lastd=getcurrentymd()
lasth=getcurrenttimeh()
while bRunThree:
try:
if bqxtoday==False:#获取气象数据
qxdata=doGetQXData(mgui)
if qxdata!='':
qxjson=json.loads(qxdata)
if qxjson:
strsql="delete from sys_weatherinfo where TotalDate='"+qxjson['date']+"' \
Insert Into sys_weatherinfo(TotalDate,wea,tem_low,tem_high,windtitle,wind_scaleV) values('{0}','{1}','{2}','{3}','{4}','{5}')".format(\
qxjson['date'],qxjson['wea'],qxjson['tem_low'],qxjson['tem_high'],qxjson['windtitle'],qxjson['wind_scaleV'])
if mgui:
global_ms.text_print.emit(mgui.textBrowser,getcurrenttimehm()+'准备执行sql:{0}'.format(strsql))
if conn.execsql(strsql):
bqxtoday=True
if mgui:
global_ms.text_print.emit(mgui.textBrowser,getcurrenttimehm()+'成功执行sql:{0}'.format(strsql))
else:
if mgui:
global_ms.text_print.emit(mgui.textBrowser,getcurrenttimehm()+'执行sql:{0}失败'.format(strsql))
if bqxtoday and bhxtoday:#获取海洋气象数据
hxdata=doGetHYData(mgui)
if hxdata!='':
hxjson=json.loads(hxdata)
if hxjson:
waveH=getWaveinfo(float(hxjson['waveH']))
气象和海洋气象信息获取
需积分: 5 182 浏览量
2023-09-23
09:33:00
上传
评论
收藏 20KB RAR 举报

czs973124
- 粉丝: 0
- 资源: 6
最新资源
- sm2.js,前端加密算法,主要方法sm2EncryptPwd
- 人工智能-项目实践-jira-Python Jira library. Development chat
- Python俄罗斯方块Tetris源文件下载
- 基于Java 实现的LFU算法,特别适合新手,带有测试case
- 基于Java实现的LRU算法,特别适合新手,带有测试case
- 人工智能-项目实践-数据结构-冒泡排序、选择排序、快速排序、堆排序、插入排序、希尔排序、归并排序.zip
- 基于SpringBoot+Vue实现增删改查和分页查询DEMO(源码+数据库)作业
- C++ OnnxRuntime部署yolov8模型
- 人工智能-项目实践-数据结构-冒泡排序;直接插入排序;希尔排序;快速排序;堆排序;归并排序;基数排序.zip
- 人工智能-项目实践-数据结构-二叉树的层序遍历(左-右).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


