一、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()