爬取疫情数据并可视化

一、https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5在这个网站上爬取的实时疫情数据
在这里插入图片描述

二、https://search.cctv.com/search.php?qtext=%E7%96%AB%E6%83%85&type=web在这个网站上爬取的有关疫情新闻
在这里插入图片描述

三、根据爬取的数据生成词云形式
在这里插入图片描述

四、程序运行后的主界面,文件主要保存在F盘内

在这里插入图片描述

五、生成的疫情实时数据,并数据可视化
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

import tkinter 
import tkinter.messagebox

import requests
import re
import json

from tkinter import ttk
from tkinter import *

import matplotlib.pyplot as plt
import numpy as np

import pandas as pd
from pylab import *
import jieba.analyse
#云图处理库
from wordcloud import WordCloud,ImageColorGenerator
import matplotlib.pyplot as plt            #图像展示模块
import matplotlib.font_manager as fm       #中文处理模块
import PIL.Image as image                  #图像处理模块

#url包含中国各省市当日实时数据

url='https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
headers={
    'user-agent':'Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
    }
response_1=requests.get(url=url,headers=headers).json()
data1=json.loads(response_1['data'])

global lastUpdateTime
lastUpdateTime=data1["lastUpdateTime"]
#获取中国当日实时数据
num=data1['areaTree'][0]['children']

#分别统计每个省市的数据
data={}#确诊数据
suspect_data={}#疑似数据
dead_data={}#死亡数据
heal_data={}#治愈数据
new_data={}#新增确诊数据
for item in num:
    if item['name'] not in data:#如果城市的名字没有在data中加入
        data.update({item['name']:0})
    if item['name'] not in suspect_data:
        suspect_data.update({item['name']:0})
    if item['name'] not in dead_data:
           dead_data.update({item['name']:0})
    if item['name'] not in heal_data:
           heal_data.update({item['name']:0})
    if item['name'] not in new_data:
           new_data.update({item['name']:0})
    for province in item['children']:
                 data[item['name']]+=int(province['total']['confirm'])
                 suspect_data[item['name']]+=int(province['total']['suspect'])
                 dead_data[item['name']]+=int(province['total']['dead'])
                 heal_data[item['name']]+=int(province['total']['heal'])
                 new_data[item['name']]+=int(province['today']['confirm'])
#转换成列表
name=list(data.keys())
num1=list(data.values())
num2=list(suspect_data.values())
num3=list(dead_data.values())
num4=list(heal_data.values())
num5=list(new_data.values())


#----------存入els工作表中--------------------------------------
def excel(name,num1,num2,num3,num4,num5):
    filename='F:\\'+lastUpdateTime.split(' ')[0]+'1.csv'
    with open(filename,'w',encoding='utf_8_sig',newline="") as f:
      f.write('省份,确诊数据,疑似数据,死亡数据,治愈人数,新增人数\n')
      i=0
      while i<len(name):
          f.write(name[i]+','+str(num1[i])+','+str(num2[i])+','+str(num3[i])+','+str(num4[i])+','+str(num5[i])+'\n')
          i+=1
    f.close()
    tkinter.messagebox.showinfo(title='excel',message=("已存入到",filename))


#------------------保存文件----------------------
def keepfile(data,lastUpdateTime):
    filename='F:\\'+lastUpdateTime.split(' ')[0]+'keepfile.json'
    with open(filename,'w',encoding='utf-8')as f:
           f.write(response_1['data'])
           f.close()
    tkinter.messagebox.showinfo(title='keepfile',message=("已存入到",filename))
           
#--------------绘制饼图-------------
def draw_bar(name,num1,num2,num3,num4,num5):
    name=name[0:10:1]

    plt.rcParams['font.sans-serif']='SimHei'#设置中文显示
    fig = plt.figure(figsize=(150,150))
    explode=[0.15]*len(name)#设定各项距离圆心n个半径
    colors=['yellowgreen','gold','#FF0000','lightcoral']
    label=name

    plt.subplot(3,2,1)
    num1=num1[0:10:1]
    plt.title('确诊数据')
    plt.pie(num1,explode=explode,colors=colors,labels=label,autopct='%1.1f%%')

    num2=num2[0:10:1]
    plt.subplot(3,2,2)
    plt.title('疑似数据')
    plt.pie(num2,explode=explode,colors=colors,labels=label,autopct='%1.1f%%')


    num3=num3[0:10:1]
    plt.subplot(3,2,3)
    plt.title('死亡数据')
    plt.pie(num3,explode=explode,colors=colors,labels=label,autopct='%1.1f%%')

    num4=num4[0:10:1]
    plt.subplot(3,2,4)
    plt.title('治愈数据')
    plt.pie(num3,explode=explode,colors=colors,labels=label,autopct='%1.1f%%')

    num5=num5[0:10:1]
    plt.subplot(3,2,5)
    plt.title('新增确诊数据')
    plt.pie(num5,explode=explode,colors=colors,labels=label,autopct='%1.1f%%')

    plt.show()
    
    filename='F:\\'+lastUpdateTime.split(' ')[0]+'bar.jpg'
    plt.savefig(filename)
    
    tkinter.messagebox.showinfo(title='饼图',message=("已存入到",filename))

#---------------绘制折线图-------------
def draw_zhe(name,num1,num2,num3,num4,num5):
    mpl.rcParams['font.sans-serif']='SimHei'#设置中文显示
    plt.figure(figsize=(150,150))#将画布设定为正方形
    ax1 = plt.subplot(5,1,1)                
    ax2 = plt.subplot(5,1,2)                   
    ax3 = plt.subplot(5,1,3)   
    ax4 = plt.subplot(5,1,4)                   
    ax5 = plt.subplot(5,1,5)                   

    plt.sca(ax1)
    plt.title('确诊数据')
    plt.plot(name,num1,'ro-',color='#4169E1',alpha=0.8,label='确诊数据疫情统计')#plot中的参数横轴值,纵轴值,线形状,颜色,透明度,线的宽度和标签
    plt.ylim(0,70000)
    for x, y in zip(name,num1):#加数据标签
         plt.text(x,y+0.3,'%.0f'%y,ha='center',va='bottom',fontsize=10.5)

    plt.legend(loc="upper right")#标签的位置
    plt.xlabel('省份')
    plt.ylabel('人数')
    
    plt.sca(ax2)
    plt.title('疑似数据')
    plt.plot(name,num2,'r*-',color='blue',alpha=0.8,label='疑似病例疫情统计')
    plt.ylim(0,100)
    for x, y in zip(name,num2):#加数据标签
         plt.text(x,y+0.3,'%.0f'%y,ha='center',va='bottom',fontsize=10.5)

    plt.legend(loc="upper right")#标签的位置
    plt.xlabel('省份')
    plt.ylabel('人数')

    plt.sca(ax3)
    plt.title('死亡数据')
    plt.plot(name,num3,'r*-',color='red',alpha=0.8,label='死亡病例疫情统计')
    plt.ylim(0,5000)
    for x, y in zip(name,num3):#加数据标签
         plt.text(x,y+0.3,'%.0f'%y,ha='center',va='bottom',fontsize=10.5)

    plt.legend(loc="upper right")#标签的位置
    plt.xlabel('省份')
    plt.ylabel('人数')

    plt.sca(ax4)
    plt.title('治愈数据')
    plt.plot(name,num4,'g-.+',color='c',alpha=0.8,label='治愈数据疫情统计')
    plt.ylim(0,70000)
    for x, y in zip(name,num4):#加数据标签
         plt.text(x,y+0.3,'%.0f'%y,ha='center',va='bottom',fontsize=10.5)

    plt.legend(loc="upper right")#标签的位置
    plt.xlabel('省份')
    plt.ylabel('人数')

    plt.sca(ax5)
    plt.title('新增确诊数据')
    plt.plot(name,num5,'m:x',color='purple',alpha=0.8,label='新增确诊数据疫情统计')
    plt.ylim(0,100)
    for x, y in zip(name,num5):#加数据标签
         plt.text(x,y+0.3,'%.0f'%y,ha='center',va='bottom',fontsize=10.5)

    plt.legend(loc="upper right")#标签的位置
    plt.xlabel('省份')
    plt.ylabel('人数')

    plt.show()
    
    filename='F:\\'+lastUpdateTime.split(' ')[0]+'折线图.jpg'
    plt.savefig(filename)
    tkinter.messagebox.showinfo(title='折线图',message=("已存入到",filename))
     
#----------------------转换为表格---------------------------
def biaoge(name,num1,num2,num3,num4,num5):
    
   root = Tk()  # 初始框的声明
   columns=('省份','确诊人数','疑似人数','死亡人数','治愈人数','新增人数')
   treeview = ttk.Treeview(root, height=18, show="headings", columns=columns)  # 表格

   treeview.column("省份", width=100, anchor='center') # 表示列
   treeview.column("确诊人数", width=100, anchor='center')
   treeview.column("疑似人数", width=100, anchor='center')
   treeview.column("死亡人数", width=100, anchor='center')
   treeview.column("治愈人数", width=100, anchor='center')
   treeview.column("新增人数", width=100, anchor='center')

   treeview.heading('省份',text='省份')
   treeview.heading('确诊人数',text='确诊人数')
   treeview.heading('疑似人数',text='疑似人数')
   treeview.heading('死亡人数',text='死亡人数')
   treeview.heading('治愈人数',text='治愈人数')
   treeview.heading('新增人数',text='新增人数')

   treeview.pack(side=LEFT,fill=BOTH)


   for i in range(len(name)): # 写入数据
      treeview.insert('', i, values=(name[i], num1[i],num2[i],num3[i],num4[i],num4[i],num5[i]))

   t=treeview.get_children()

   root.mainloop()

#--------------------------绘制疫情实时消息云图-----------------------------------
def yun():

     def get_datas(url):
         headers={
               'user-agent':'Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
         }#为了防止被反爬虫
         response=requests.get(url,headers=headers)
         if response.status_code==200:
           return response.text
         return None

     def parse_page(html):
        pattern=re.compile('[^\x00-\xff]',re.S)
        items=re.findall(pattern,html)
        items=''.join(items[500:1469])
    
        with open('疫情实时.txt','a',encoding='utf-8')as f:
           f.write(items)
           f.close()
           tkinter.messagebox.showinfo(title='保存疫情实时信息',message=("信息保存在疫情实时.txt"))
     curl="https://search.cctv.com/search.php?qtext=%E7%96%AB%E6%83%85&type=web"
     html=get_datas(curl)
     print("------------------------------------------------------------")
     parse_page(html)
     #对词库处理
     def participle_word(text):
       text_list=jieba.cut(text)
       newtext=' '.join(text_list)
       return newtext
     with open("疫情实时.txt",'r', encoding='UTF-8') as fp:
         text=fp.read()
         text=participle_word(text)
         
         mask=np.array(image.open('F:\\爱心.jpg'))  #图片背景形状  

         wc=WordCloud(
           background_color="white",               #背景颜色
           max_words=150,                          #最多显示的词数
           mask=mask,                              #设置图片的背景
           max_font_size=60,                       #最大的字符
           random_state=42,                        
           font_path='C:/Windows/Fonts/simkai.ttf' #中文处理,用系统自带的字体
           ).generate(text)                        

         my_font=fm.FontProperties(fname='C:/Windows/Fonts/simkai.ttf') #词云字体设置
         image_colors=ImageColorGenerator(mask)      #基于彩色图像的颜色生成器 提取背景图片颜色
         wc.recolor(color_func=image_colors)         # 将词云颜色设置为背景图的颜色       

         plt.imshow(wc,interpolation="bilinear")     #画图
         wc.to_file("dng.png")                       #保存云图
         plt.show()
         tkinter.messagebox.showinfo(title='词云',message="文件保存为爱心.png")
         
def a():#调用保存文件函数
   keepfile(data,lastUpdateTime) 
def b():#调用excel函数
    excel(name,num1,num2,num3,num4,num5)
def c():#调用draw_bar函数
    draw_bar(name,num1,num2,num3,num4,num5)
def d():#调用折线图函数
    draw_zhe(name,num1,num2,num3,num4,num5)
def e():#调用表格函数
    biaoge(name,num1,num2,num3,num4,num5)
    
root=tkinter.Tk()
#设置窗口标题
root.title('疫情分析')
#设置窗体大小
root['height']=320
root['width']=320
#创建标签
labelName=tkinter.Label(root,text='疫情分析与统计')
labelName.place(x=30,y=10)

labelName=tkinter.Label(root,text='点击下面的按钮了解你想知道的内容吧!')
labelName.place(x=30,y=30)

buttonyun=tkinter.Button(root,text='生成词云',command=yun,bg='red',fg='blue')
buttonyun.place(x=30,y=70,width=80,height=20)

buttonyun=tkinter.Button(root,text='保存疫情数据',command=a,bg='red',fg='blue')
buttonyun.place(x=120,y=70,width=80,height=20)

buttonexcel=tkinter.Button(root,text='生成excel',command=b,bg='yellow',fg='purple')
buttonexcel.place(x=30,y=100,width=80,height=20)


buttonbie=tkinter.Button(root,text='生成饼图',command=c,bg='yellow',fg='purple')
buttonbie.place(x=120,y=100,width=80,height=20)

buttonzhe=tkinter.Button(root,text='生成折线图',command=d,bg='green',fg='blue')
buttonzhe.place(x=30,y=130,width=80,height=20)

button2=tkinter.Button(root,text='生成表格',command=e,bg='green',fg='blue')
button2.place(x=120,y=130,width=80,height=20)

root.mainloop()







       

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值