使用pyside2编写国内疫情实时更新+MySQL的应用程序

        引言:数据来源实时更新:新冠肺炎疫情最新动态,程序主要的功能是通过json解析网页数据,获取最新的数据并保存到数据库中,一是获取全国各个省份疫情数据,二是获取近期高风险地区的数据展现在程序内,打开程序就能看到最新的数据。

开发工具:VS Code 、MySQL、Qt designer

引入模块

from threading import Thread
import threading
import requests
import json
import jsonpath
from PySide2.QtWidgets import QApplication
from PySide2.QtGui import  QIcon
from PySide2.QtCore import QFile,QTimer,QDateTime
from PySide2.QtUiTools import QUiLoader
import pymysql
import wmi

第一步,通过打开开发者工具,找到指向数据的url

https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=statisGradeCityDetail

 查看网页代码,主要是获取近期以来区域风险地区信息,我们就会看到这样页数数据

获取近期以来区域风险情况的省份信息,代码如下

def China(self):
        # 申请第二把锁
        self.lock_object.acquire()
        # 打开数据库连接
        db = pymysql.connect(host="主机名", user="用户名", password="密码",database="数据库",charset='utf8' )
        # 使用cursor()方法获取操作游标
        cursor = db.cursor()
        global vat_info
        # 遍历字典中的列表获取区域风险地区的信息
        for index in self.vac_list['vac_dat'][0]:
            data_province = jsonpath.jsonpath(self.data,"$.."+index)
        for index in self.vac_list['vac_dat'][1]:
            data_city = jsonpath.jsonpath(self.data,"$.."+index)
        for index in self.vac_list['vac_dat'][2]:
            data_confirmAdd = jsonpath.jsonpath(self.data,"$.."+index)
        for index in self.vac_list['vac_dat'][3]:
            data_grade = jsonpath.jsonpath(self.data,"$.."+index)
        for index in self.vac_list['vac_dat'][4]:
            data_date = jsonpath.jsonpath(self.data,"$.."+index)
        for index in self.vac_list['vac_dat'][5]:
            data_syear = jsonpath.jsonpath(self.data,"$.."+index)
        vat_info = list(zip(data_province,data_city,data_confirmAdd,data_grade,data_syear,data_date))
        # 删除数据库
        cursor.execute('drop database 数据库')
        # 判断SNA数据库是否存在,不存在则新建
        cursor.execute('CREATE DATABASE IF NOT EXISTS 数据库 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;')
        # 打开数据库
        cursor.execute('use 数据库')
        # 新建数据表
        cursor.execute("CREATE TABLE 数据表(id int(11) Primary key auto_increment,\
                                        city char(20),newdia int(11),\
                                        Higare char(20),update_time char(20))")
        for get in vat_info:
            vac_pros = get[0]
            self.vac_list['get_list'].append(vac_pros)
            pros_list = list(set(self.vac_list['get_list']))
            # 比较的元素
            pros_list.sort(key=self.vac_list['get_list'].index)
        # 添加省份名字到下拉框
        for i in pros_list:
            self.ui.pro_box_2.addItem(i)
            # get[4]指date值不全的字符串下标
            if get[4] == 0:
                try:
                        # 插入数据并执行SQL语句
                        cursor.execute("INSERT INTO 数据表(city,newdia,Higare,update_time) \
                                        VALUES ('{0}',{1},'{2}',{3})".format(get[1],get[2],get[3],'暂无'))
                        # 提交到数据库执行
                        db.commit()
                except:
                        # 发生错误时回滚
                        db.rollback()
            else:
                try:
                        cursor.execute("INSERT INTO 数据表(city,newdia,Higare,update_time) \
                                        VALUES ('{0}',{1},'{2}','{3}/{4}')".format(get[1],get[2],get[3],get[4],get[5]))
                        db.commit()
                except:
                        db.rollback()
        # 关闭数据库连接
        db.close()
        # 释放第二把锁
        self.lock_object.release()
        # 创建第三个线程对象
        thread_3 = Thread(target=self.log_msg)
        # 启动线程
        thread_3.start()

 city:表示城市

newdia:表示新增人数

Higare:表示风险级别

update_time:表示更新时间

 第二步,通过打开开发者工具,找到指向头部的url

昨天新增情况:https://view.inews.qq.com/g2/getOnsInfo?name=wuwei_ww_ww_today_notice&callback
获取全部数据:https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5

查看的网页代码,我们看到这样数据,主要是找到红色框内的数据

显示昨日数据及总数据情况,代码如下

def Head_info(self):
        # 请求头部信息的url
        url_tit = 'https://view.inews.qq.com/g2/getOnsInfo?name=wuwei_ww_ww_today_notice&callback'
        url_dat = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
        # 解析data
        data_title = json.loads(requests.get(url_tit).json()['data'])
        # 遍历请求到的数据追加到文本并显示
        for index in data_title:
            self.ui.hea_log.appendPlainText('>>{0}'.format(index['showNotice']))
        # 解析data
        data = json.loads(requests.get(url_dat).json()['data'])
        sys_time = data['lastUpdateTime']
        Cna_pro = data['chinaTotal']
        chi_add = data['chinaAdd']
        # 遍历获取到数据的值添加到value和add列表
        for index in self.vac_list['tot_list']:
            self.vac_list['value'].append(Cna_pro[index])
            self.vac_list['add'].append(chi_add[index])
        # 打包为元组的列表
        total_info = list(zip(self.vac_list['name'],self.vac_list['value'],self.vac_list['add'],self.vac_list['add_list']))
        self.ui.hea_log.appendPlainText('统计截至: {0}'.format(sys_time))
        for get in total_info:
            self.ui.hea_log.appendPlainText('>>{0}{1}\t{3}{2}'.format(get[0],get[1],get[2],get[3]))
        # 创建第二个线程对象
        thread_2 = Thread(target=self.Cna_pro)
        # 启动线程
        thread_2.start()

第三步,通过打开开发者工具,找到指向全国各个省份疫情数据的url

https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5

查看网页代码,看到这样的数据,主要是获取每个省份及城市的疫情情况

 各个省份情况数据,代码如下

def China(self):
        # 申请第二把锁
        self.lock_object.acquire()
        # 打开数据库连接
        db = pymysql.connect(host="主机名", user="用户", password="密码",database="数据库",charset='utf8' )
        # 使用cursor()方法获取操作游标
        cursor = db.cursor()
        global vat_info
        # 遍历字典中的列表获取区域风险地区的信息
        for index in self.vac_list['vac_dat'][0]:
            data_province = jsonpath.jsonpath(self.data,"$.."+index)
        for index in self.vac_list['vac_dat'][1]:
            data_city = jsonpath.jsonpath(self.data,"$.."+index)
        for index in self.vac_list['vac_dat'][2]:
            data_confirmAdd = jsonpath.jsonpath(self.data,"$.."+index)
        for index in self.vac_list['vac_dat'][3]:
            data_grade = jsonpath.jsonpath(self.data,"$.."+index)
        for index in self.vac_list['vac_dat'][4]:
            data_date = jsonpath.jsonpath(self.data,"$.."+index)
        for index in self.vac_list['vac_dat'][5]:
            data_syear = jsonpath.jsonpath(self.data,"$.."+index)
        vat_info = list(zip(data_province,data_city,data_confirmAdd,data_grade,data_syear,data_date))
        # 删除数据库
        cursor.execute('drop database 数据库')
        # 判断SNA数据库是否存在,不存在则新建
        cursor.execute('CREATE DATABASE IF NOT EXISTS 数据库 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;')
        # 打开数据库
        cursor.execute('use 数据库')
        # 新建数据表
        cursor.execute("CREATE TABLE 数据表(id int(11) Primary key auto_increment,\
                                        city char(20),newdia int(11),\
                                        Higare char(20),update_time char(20))")
        for get in vat_info:
            vac_pros = get[0]
            self.vac_list['get_list'].append(vac_pros)
            pros_list = list(set(self.vac_list['get_list']))
            # 比较的元素
            pros_list.sort(key=self.vac_list['get_list'].index)
        # 添加省份名字到下拉框
        for i in pros_list:
            self.ui.pro_box_2.addItem(i)
            # get[4]指date值不全的字符串下标
            if get[4] == 0:
                try:
                        # 插入数据并执行SQL语句
                        cursor.execute("INSERT INTO 数据表(city,newdia,Higare,update_time) \
                                        VALUES ('{0}',{1},'{2}',{3})".format(get[1],get[2],get[3],'暂无'))
                        # 提交到数据库执行
                        db.commit()
                except:
                        # 发生错误时回滚
                        db.rollback()
            else:
                try:
                        cursor.execute("INSERT INTO 数据表(city,newdia,Higare,update_time) \
                                        VALUES ('{0}',{1},'{2}','{3}/{4}')".format(get[1],get[2],get[3],get[4],get[5]))
                        db.commit()
                except:
                        db.rollback()
        # 关闭数据库连接
        db.close()
        # 释放第二把锁
        self.lock_object.release()
        # 创建第三个线程对象
        thread_3 = Thread(target=self.log_msg)
        # 启动线程
        thread_3.start()

为每一个省份创建一张数据表,用来存储各个省份城市的疫情信息, 

 get['name']:表示城市

get['today']['confirm']:表示新增确诊

get['total']['nowConfirm']:表示现有确诊

get['total']['confirm']:表示累计确诊

get['total']['heal']:表示治愈人数

get['total']['dead']:表示死亡人数

index[0]:表示省份

sys_time:表示更新时间

第四步,以上代码执行完,如网络断开及数据库未打开错误信息,会保存到日志文件中,代码如下

def log_msg(self):
        fp = open("G:/log_msg/EpiTra_data/log.txt","a",encoding='utf_8')
        self.Solt_TimeUpdate()
        fp.write("< 1 --Suc--Info-- >  %s\n" % (localTime))
        fp.close()

把以上的函数保存到一个类中,每一个函数该做什么,已给每个函数创建线程对象,最后我们通过编写UI文件动态加载,这里我就不一一讲了,代码如下

qfile = QFile('UI/epidemic.ui')
        qfile.open(QFile.ReadOnly)
        qfile.close()
        self.ui = QUiLoader().load(qfile)

 使用QTimer实时更新系统时间

def Solt_TimeUpdate(self):
        def time_():
            global localTime
            #建立定时器连接通道  注意这里调用TimeUpdate方法,不是方法返回的的结果,所以不能带括号,写成self.TimeUpdate()是不对的
            localTime = QDateTime.currentDateTime().toString('yyyy-MM-dd hh:mm:ss dddd')
        thread_0 = Thread(target=time_)
        thread_0.start()

每次打开程序就检查当前网络是否连接,代码如下

 try:
            # 测试url来判断使用之前是否连接网络
            url = 'https://baidu.com'
            requests.get(url,timeout=2)
            self.url = 'https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=statisGradeCityDetail'
            self.resp = requests.post(self.url)
            self.data = json.loads(self.resp.text)
            # 创建第一个线程对象
            thread_1 = Thread(target=self.Head_info)
            # 启动线程
            thread_1.start()
        # 处理网络未连接的Err信息
        except Exception as e:
            self.Solt_TimeUpdate()
            self.ui.eqi_log.appendPlainText('%s\n----------未连接网络----------\nErr:%s' % (localTime,type(e)))
            # 写入日志文件
            with open("G:/log_msg/EpiTra_data/log.txt","a",encoding='utf_8') as fp:
                # self.Solt_TimeUpdate()
                fp.write("< -1 --Err--Info-- >  %s %s\n" % (e,localTime))
            return

所有代码写完成后,发布程序

pyinstaller 执行文件 --noconsole --hidden-import PySide2.QtXml --icon="图标路径"

最终运行效果 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值