panna

使用Python爬取腾讯新闻疫情数据,并使用pyecharts可视化分析

一、选题背景

疫情从2020年开始到现在,一直都是最受人瞩目的事件之一。其上面的数据也是我们最为关注的因素,也是反映最直观的数据,也是最能够反映疫情的状况的方面。近期,国内的疫情又出现了反弹,腾讯新闻网站上的新冠疫情疫情实时追踪上的数据,也日益在更新,在本土现有确诊、现有确诊、累计确诊、无症状感染者、境外输入,都有在实时更新,所以选取这些数据,进行可视化分析,让网页上数据更加清晰明了,也让新冠疫情的局势更加一目了然。

二、主题式网络爬虫设计方案

1.主题式网络爬虫名称

·使用Python爬取腾讯新闻疫情数据

2.主题式网络爬虫爬取的内容与数据特征分析

·所要爬取数据的网址:https://news.qq.com/zt2020/page/feiyan.htm#/

·对于静态网页,我们只需要把网页地址栏中的url传到get请求中就可以轻松地获取到网页的数据。

  以浙江的数据界面为例,根据源代码筐显示,所需要的网址和所需要的数据集都均有体现,我们所要用的网址有了,就可以进行数据爬取。

 

3.主题式网络爬虫设计方案概述

(1)首先进行模块导入,将数据爬取所需要的模块进行导入,方便进行数据爬取

  ·源码:

 

1 import time
2 import json
3 import requests
4 from datetime import datetime
5 import pandas as pd
6 import numpy as np

 

(2)抓取数据,将数据从对应的网址中抓取出来,利用get()语句将数据从网址中提取出来

     ·源码:

1 def Domestic():
2     url = \'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5\'
3     reponse = requests.get(url=url).json()
4     data = json.loads(reponse[\'data\'])
5     return data
6 domestic = Domestic()

(3)将提取的数据导入excel中,方便后面的数据分析及数据可视化,即图像的生成及分析

      ·源码:

 1 areaTree = domestic[\'areaTree\']
 2 china_data = areaTree[0][\'children\']
 3 china_list = []
 4 list_province=[] #柱状图
 5 list_nowConfirm=[]  #柱状图
 6 list_conrirm=[]     #累计确证
 7 for a in range(len(china_data)):
 8     province = china_data[a][\'name\']
 9     confirm = china_data[a][\'total\'][\'confirm\']
10     heal = china_data[a][\'total\'][\'heal\']
11     dead = china_data[a][\'total\'][\'dead\']
12     nowConfirm = confirm - heal - dead
13     china_dict = {}
14     china_dict[\'province\'] = province
15     china_dict[\'nowConfirm\'] = nowConfirm
16     china_dict[\'confirm\']=confirm
17     china_list.append(china_dict)
18     list_province.append(province)
19     list_nowConfirm.append(nowConfirm)
20     list_conrirm.append(confirm)
21 china_data = pd.DataFrame(china_list)
22 china_data.to_excel(\'疫情数据.xlsx\',index=False) #存储为EXCEL文件
23 china_data.head()

程序运行结果,输出前五行代码进行检验,将下面两图之间的数据进行比对,检查所生成的数据有误与否,经过检验无误,说明数据导出及数据存储成功。

 

 

三、数据可视化分析 

1.pyecharts介绍:

(1)简介:

本次的程序设计采用的是pyecharts可视化,用pyecharts组件技术以各类图表形式(柱状图、折线图、饼图)实现数据可视化模块的展示。pyecharts 是一个用于生成 Echarts 图表的类库。实际上就是 Echarts 与 Python 的对接。Echarts 是百度开源的一个数据可视化JS 库。

(2)优点:

可以很方便的对全世界各国进行地域图表绘制,同时可以在线导入数据和色板设置,让数据更加的直观且生动

2.将excel中的数据提取并进行分析

(1)绘制国内各地区现有确诊人数地图

       ·源码:

 1 #绘制国内各地区现有确诊人数地图
 2 
 3 import pyecharts.options as opts
 4 from pyecharts.charts import Map
 5 from pyecharts.globals import CurrentConfig, NotebookType
 6 CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
 7 m = Map()
 8 m.add("", [
 9     list(z)
10     for z in zip(list(china_data["province"]), list(china_data["nowConfirm"]))
11 ],
12       maptype="china",
13       is_map_symbol_show=False)
14 m.set_global_opts(
15     title_opts=opts.TitleOpts(title="COVID-19中国现有地区现有确诊人数地图"),
16     visualmap_opts=opts.VisualMapOpts(
17         is_piecewise=True,
18         pieces=[
19             {
20                 "min": 5000,
21                 "label": \'>5000\',
22                 "color": "#893448"
23             },  # 不指定 max,表示 max 为无限大
24             {
25                 "min": 1000,
26                 "max": 4999,
27                 "label": \'1000-4999\',
28                 "color": "#ff585e"
29             },
30             {
31                 "min": 500,
32                 "max": 999,
33                 "label": \'500-1000\',
34                 "color": "#fb8146"
35             },
36             {
37                 "min": 101,
38                 "max": 499,
39                 "label": \'101-499\',
40                 "color": "#ffA500"
41             },
42             {
43                 "min": 10,
44                 "max": 100,
45                 "label": \'10-100\',
46                 "color": "#ffb248"
47             },
48             {
49                 "min": 1,
50                 "max": 9,
51                 "label": \'1-9\',
52                 "color": "#fff2d1"
53             },
54             {
55                 "max": 1,
56                 "label": \'0\',
57                 "color": "#ffffff"
58             }
59         ]))
60 
61 m.render("地图.html")
62 m.render_notebook()

此方法最难的点在于,将图标在jupyter notebook上显示,需要导入很多模块,最终在网络资源汇总上,解决了这个问题。还有一个点是,将对应数据形成图表。

·程序运行结果:国内各地区确诊人数地图

数据分析:根据图像可知,现在疫情较为严重的地区在陕西、浙江、台湾,属于中风险的地区为内蒙古、山东、四川、云南、广西、广东、福建、湖南、河南、天津、北京;低风险地区有安徽、江苏、海南、甘肃、黑龙江、吉林、辽宁;其余地区现阶段还未出现有确诊病例。

(2)绘制国内各地区现有确诊人数柱状图

柱状图能够反映一组数据的最大值,最小值,以及数据大小之间的对比,能够直观的反应出确诊人数的分布情况。

       · 源码:

 1 #国内各地区现有确诊人数柱状图
 2 from pyecharts import options as opts
 3 from pyecharts.charts import Bar
 4 bar = (
 5     Bar()
 6     .add_xaxis(list_province)
 7     .add_yaxis("柱状图", list_nowConfirm)
 8     .set_global_opts(
 9         title_opts=opts.TitleOpts(title="COVID-19中国现有地区现有确诊人数柱状图"),
10         yaxis_opts=opts.AxisOpts(name="现有确证病例"),
11         xaxis_opts=opts.AxisOpts(name="地区"),
12         datazoom_opts=opts.DataZoomOpts(type_="slider")
13     )
14 )
15 bar.render("柱状图.html")
16 bar.render_notebook()

程序运行结果:

数据分析:从图标中可以看出,台湾的确诊人数是最多的,达到2339个,陕西、浙江的确诊人数居后,结合上一个国内确诊地图,将两个图像结合考虑,能够更直观的反映现阶段国内的疫情。

(3)绘制国内各地区现有确诊人数折线图

折线图,能够直观的反映数据的走向,也能够对数据之后的发展趋势进行分析

      ·源码:

 1 #国内各地区现有确诊人数折线图
 2 import pyecharts.options as opts
 3 from pyecharts.charts import Line
 4 line=(
 5     Line()
 6     .add_xaxis(xaxis_data=list_province)
 7     .add_yaxis(
 8         series_name="折线图",
 9         y_axis=list_nowConfirm,
10         is_connect_nones=True
11     )
12     .set_global_opts(title_opts=opts.TitleOpts(title="COVID-19中国现有地区现有确诊人数折线图"),
13                      yaxis_opts=opts.AxisOpts(name="现有确证病例"),
14                      xaxis_opts=opts.AxisOpts(name="地区"),
15                      datazoom_opts=opts.DataZoomOpts(type_="slider")
16      )
17 )
18 line.render("折线图.html")
19 line.render_notebook()

·程序运行结果展示:

 

 

 

 

 

 ·数据分析:从图表中可以得出,台湾的疫情是最严重的,这组数据呈现的结果跟柱状图的相类似。

 

(4)绘制国内各地区累计确诊人数地图

       ·源码:


 1 #国内各地区累计确诊人数地图
 2 import pyecharts.options as opts
 3 from pyecharts.charts import Map
 4 from pyecharts.globals import CurrentConfig, NotebookType
 5 CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
 6 m1 = Map()
 7 m1.add("", [
 8     list(z)
 9     for z in zip(list(china_data["province"]), list(china_data["confirm"]))
10 ],
11       maptype="china",
12       is_map_symbol_show=False)
13 m1.set_global_opts(
14     title_opts=opts.TitleOpts(title="COVID-19中国现有地区累计确诊人数地图"),
15     visualmap_opts=opts.VisualMapOpts(
16         is_piecewise=True,
17         pieces=[
18             {
19                 "min": 5000,
20                 "label": \'>5000\',
21                 "color": "#893448"
22             },  # 不指定 max,表示 max 为无限大
23             {
24                 "min": 1000,
25                 "max": 4999,
26                 "label": \'1000-4999\',
27                 "color": "#ff585e"
28             },
29             {
30                 "min": 500,
31                 "max": 999,
32                 "label": \'500-1000\',
33                 "color": "#fb8146"
34             },
35             {
36                 "min": 101,
37                 "max": 499,
38                 "label": \'101-499\',
39                 "color": "#ffA500"
40             },
41             {
42                 "min": 10,
43                 "max": 100,
44                 "label": \'10-100\',
45                 "color": "#ffb248"
46             },
47             {
48                 "min": 1,
49                 "max": 9,
50                 "label": \'1-9\',
51                 "color": "#fff2d1"
52             },
53             {
54                 "max": 1,
55                 "label": \'0\',
56                 "color": "#ffffff"
57             }
58         ]))
59 m1.render("地图1.html")
60 m1.render_notebook()

·程序运行结果展示:

 

数据分析:从图像可知,颜色的深浅层度放映了确诊人数的多少,颜色越深,累计确诊人数越多。从图像可知台湾的累计确诊数量最多,湖北比台湾少些。

(5)绘制国内各地区累计确诊人数柱状图

       ·源码

 1 #国内各地区累计确诊人数柱状图
 2 from pyecharts import options as opts
 3 from pyecharts.charts import Bar
 4 bar = (
 5     Bar()
 6     .add_xaxis(list_province)
 7     .add_yaxis("累计确诊柱状图", list_conrirm)
 8     .set_global_opts(
 9         title_opts=opts.TitleOpts(title="COVID-19中国现有地区累计确诊人数树状图"),
10         yaxis_opts=opts.AxisOpts(name="累计确诊病例"),
11         xaxis_opts=opts.AxisOpts(name="地区"),
12         datazoom_opts=opts.DataZoomOpts(type_="slider")
13     )
14 )
15 bar.render("累计确诊柱状图.html")
16 bear.render_notebook()

·程序运行结果展示:

 

 

 

 

· 数据分析:在这图表中显示,香港累计确诊的人数,比台湾少点,但比湖北还要多,这在地图上并不能很明显的放映,所以柱形图数据的清晰度要比地图来的高。

(6)绘制国内各地区累计确诊人数折线图

      ·源码:

 1 #国内各地区累计确诊人数折线图
 2 import pyecharts.options as opts
 3 from pyecharts.charts import Line
 4 line=(
 5     Line()
 6     .add_xaxis(xaxis_data=list_province)
 7     .add_yaxis(
 8         series_name="累计确诊折线图",
 9         y_axis=list_conrirm,
10         is_connect_nones=True
11     )
12     .set_global_opts(title_opts=opts.TitleOpts(title="COVID-19中国地区累计现有确诊人数折线图"),
13                      yaxis_opts=opts.AxisOpts(name="累计确诊病例"),
14                      xaxis_opts=opts.AxisOpts(name="地区"),
15                      datazoom_opts=opts.DataZoomOpts(type_="slider")
16      )
17 )
18 line.render("累计确诊折线图.html")
19 line.render_notebook()

·程序运行结果展示:

 

 

 

 ·数据分析:折线图的美观程度要比柱状图来的美观,数据的凸显度和柱状图差不多。

 

3.数据的持久性:

程序采用了将数据爬取后,进行了excel文件的存储,保证了数据的持久性,且每次提取都会将excel文件中的数据更新,保证了数据的及时更新性,且保存数据有利于为这个时间点爬取的数据分析,预留时间,也可以将其每次爬取的数据进行存储,方便日后数据的对比。

4.以上就是本次课程设计,完整代码如下:

  1 #导入库
  2 from pyecharts.charts import Bar
  3 from pyecharts import options as opts
  4 from pyecharts.render import make_snapshot
  5 from pyecharts.faker import Collector, Faker
  6 #导入模块
  7 import time
  8 import json
  9 import requests
 10 from datetime import datetime
 11 import pandas as pd
 12 import numpy as np
 13 
 14 #抓取数据
 15 def Domestic():
 16     url = \'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5\'
 17     reponse = requests.get(url=url).json()
 18     data = json.loads(reponse[\'data\'])
 19     return data
 20 domestic = Domestic()
 21 
 22 #提取数据并写入excel
 23 areaTree = domestic[\'areaTree\']
 24 china_data = areaTree[0][\'children\']
 25 china_list = []
 26 list_province=[] #柱状图
 27 list_nowConfirm=[]  #柱状图
 28 list_conrirm=[]     #累计确证
 29 for a in range(len(china_data)):
 30     province = china_data[a][\'name\']
 31     confirm = china_data[a][\'total\'][\'confirm\']
 32     heal = china_data[a][\'total\'][\'heal\']
 33     dead = china_data[a][\'total\'][\'dead\']
 34     nowConfirm = confirm - heal - dead
 35     china_dict = {}
 36     china_dict[\'province\'] = province
 37     china_dict[\'nowConfirm\'] = nowConfirm
 38     china_dict[\'confirm\']=confirm
 39     china_list.append(china_dict)
 40     list_province.append(province)
 41     list_nowConfirm.append(nowConfirm)
 42     list_conrirm.append(confirm)
 43 china_data = pd.DataFrame(china_list)
 44 china_data.to_excel(\'疫情数据.xlsx\',index=False) #存储为EXCEL文件
 45 china_data.head()#生成前五个数据
 46 
 47 #使用pyecharts可视化
 48 
 49 #绘制国内各地区现有确诊人数地图
 50 
 51 import pyecharts.options as opts
 52 from pyecharts.charts import Map
 53 from pyecharts.globals import CurrentConfig, NotebookType
 54 CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
 55 m = Map()
 56 m.add("", [
 57     list(z)
 58     for z in zip(list(china_data["province"]), list(china_data["nowConfirm"]))
 59 ],
 60       maptype="china",
 61       is_map_symbol_show=False)
 62 m.set_global_opts(
 63     title_opts=opts.TitleOpts(title="COVID-19中国现有地区现有确诊人数地图"),
 64     visualmap_opts=opts.VisualMapOpts(
 65         is_piecewise=True,
 66         pieces=[
 67             {
 68                 "min": 5000,
 69                 "label": \'>5000\',
 70                 "color": "#893448"
 71             },  # 不指定 max,表示 max 为无限大
 72             {
 73                 "min": 1000,
 74                 "max": 4999,
 75                 "label": \'1000-4999\',
 76                 "color": "#ff585e"
 77             },
 78             {
 79                 "min": 500,
 80                 "max": 999,
 81                 "label": \'500-1000\',
 82                 "color": "#fb8146"
 83             },
 84             {
 85                 "min": 101,
 86                 "max": 499,
 87                 "label": \'101-499\',
 88                 "color": "#ffA500"
 89             },
 90             {
 91                 "min": 10,
 92                 "max": 100,
 93                 "label": \'10-100\',
 94                 "color": "#ffb248"
 95             },
 96             {
 97                 "min": 1,
 98                 "max": 9,
 99                 "label": \'1-9\',
100                 "color": "#fff2d1"
101             },
102             {
103                 "max": 1,
104                 "label": \'0\',
105                 "color": "#ffffff"
106             }
107         ]))
108 
109 m.render("地图.html")
110 m.render_notebook()
111 
112 #国内各地区现有确诊人数柱状图
113 from pyecharts import options as opts
114 from pyecharts.charts import Bar
115 bar = (
116     Bar()
117     .add_xaxis(list_province)
118     .add_yaxis("柱状图", list_nowConfirm)
119     .set_global_opts(
120         title_opts=opts.TitleOpts(title="COVID-19中国现有地区现有确诊人数柱状图"),
121         yaxis_opts=opts.AxisOpts(name="现有确证病例"),
122         xaxis_opts=opts.AxisOpts(name="地区"),
123         datazoom_opts=opts.DataZoomOpts(type_="slider")
124     )
125 )
126 bar.render("柱状图.html")
127 bar.render_notebook()
128 
129 #国内各地区现有确诊人数折线图
130 import pyecharts.options as opts
131 from pyecharts.charts import Line
132 line=(
133     Line()
134     .add_xaxis(xaxis_data=list_province)
135     .add_yaxis(
136         series_name="折线图",
137         y_axis=list_nowConfirm,
138         is_connect_nones=True
139     )
140     .set_global_opts(title_opts=opts.TitleOpts(title="COVID-19中国现有地区现有确诊人数折线图"),
141                      yaxis_opts=opts.AxisOpts(name="现有确证病例"),
142                      xaxis_opts=opts.AxisOpts(name="地区"),
143                      datazoom_opts=opts.DataZoomOpts(type_="slider")
144      )
145 )
146 line.render("折线图.html")
147 line.render_notebook()
148 
149 #国内各地区累计确诊人数地图
150 import pyecharts.options as opts
151 from pyecharts.charts import Map
152 from pyecharts.globals import CurrentConfig, NotebookType
153 CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
154 m1 = Map()
155 m1.add("", [
156     list(z)
157     for z in zip(list(china_data["province"]), list(china_data["confirm"]))
158 ],
159       maptype="china",
160       is_map_symbol_show=False)
161 m1.set_global_opts(
162     title_opts=opts.TitleOpts(title="COVID-19中国现有地区累计确诊人数地图"),
163     visualmap_opts=opts.VisualMapOpts(
164         is_piecewise=True,
165         pieces=[
166             {
167                 "min": 5000,
168                 "label": \'>5000\',
169                 "color": "#893448"
170             },  # 不指定 max,表示 max 为无限大
171             {
172                 "min": 1000,
173                 "max": 4999,
174                 "label": \'1000-4999\',
175                 "color": "#ff585e"
176             },
177             {
178                 "min": 500,
179                 "max": 999,
180                 "label": \'500-1000\',
181                 "color": "#fb8146"
182             },
183             {
184                 "min": 101,
185                 "max": 499,
186                 "label": \'101-499\',
187                 "color": "#ffA500"
188             },
189             {
190                 "min": 10,
191                 "max": 100,
192                 "label": \'10-100\',
193                 "color": "#ffb248"
194             },
195             {
196                 "min": 1,
197                 "max": 9,
198                 "label": \'1-9\',
199                 "color": "#fff2d1"
200             },
201             {
202                 "max": 1,
203                 "label": \'0\',
204                 "color": "#ffffff"
205             }
206         ]))
207 m1.render("地图1.html")
208 m1.render_notebook()
209 
210 #国内各地区累计确诊人数柱状图
211 from pyecharts import options as opts
212 from pyecharts.charts import Bar
213 bar = (
214     Bar()
215     .add_xaxis(list_province)
216     .add_yaxis("累计确诊柱状图", list_conrirm)
217     .set_global_opts(
218         title_opts=opts.TitleOpts(title="COVID-19中国现有地区累计确诊人数树状图"),
219         yaxis_opts=opts.AxisOpts(name="累计确诊病例"),
220         xaxis_opts=opts.AxisOpts(name="地区"),
221         datazoom_opts=opts.DataZoomOpts(type_="slider")
222     )
223 )
224 bar.render("累计确诊柱状图.html")
225 bear.render_notebook()
226 
227 #国内各地区累计确诊人数折线图
228 import pyecharts.options as opts
229 from pyecharts.charts import Line
230 line=(
231     Line()
232     .add_xaxis(xaxis_data=list_province)
233     .add_yaxis(
234         series_name="累计确诊折线图",
235         y_axis=list_conrirm,
236         is_connect_nones=True
237     )
238     .set_global_opts(title_opts=opts.TitleOpts(title="COVID-19中国地区累计现有确诊人数折线图"),
239                      yaxis_opts=opts.AxisOpts(name="累计确诊病例"),
240                      xaxis_opts=opts.AxisOpts(name="地区"),
241                      datazoom_opts=opts.DataZoomOpts(type_="slider")
242      )
243 )
244 line.render("累计确诊折线图.html")
245 line.render_notebook()

四、总结:

1.预期与结果

(1)本次课程设计较好的完成了预期的目标,成功的将所需的数据集爬取出来,并进行了excel文件的生成,保证了数据保存和数据分析的准确性;

(2)利用了pyecharts进行数据可视化分析,使得数据能够更直观,更明了的展示,这也给数据分析提供了便利,也让数据分析更加准确。

2.不足之处:

(1)在进行利用pyecharts进行可视化分析的时候,有许多知识点和语句都是含糊不清,为了让数据更加的清晰,花费了过多的时间;

(2)在于jupyter notebook上图标的显示上也花费了不少的时间,需要将其需要的库进行下载安装,也花费了不少的时间;

3.收获:

通过这次的课程设计,对于pyecharts的数据分析更加的熟练,但还是需要改进,也懂得了如何在pyecharts可视化分析的时候,需要什么库,要怎么样才能在jupyter notebook上显示图表。

 

 

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2021-12-02
  • 2022-12-23
  • 2022-12-23
  • 2021-12-06
  • 2022-12-23
  • 2021-12-22
猜你喜欢
  • 2022-12-23
  • 2021-07-13
  • 2022-12-23
  • 2022-12-23
  • 2021-10-21
相关资源
相似解决方案