论文部分内容阅读
摘 要:目的:直观显示新型冠状病毒(2019-nCoV)肺炎疫情的发展趋势,为复工复产的决策提供决策依据。方法:基于Python语言、使用requests库下载网页,使用re读取目标数据,使用csv存储目标数据、使用pyecharts展示疫情地图分布和疫情发展趋势图、使用Javascript脚本显示趋势图,包括疫情的地图分布,全国疫情新增趋势,全国累计/疑似趋势,全国累计治愈/死亡趋势,全国各省疫情概览表等。结果:得到疫情发展趋势的可视化图表,可以直观显示疫情的发展趋势,全国各省疫情概览表等。我们可以看到,疫情已经趋于平稳。结论:2019-nCoV肺炎疫情的防控措施是有效的,各地方政府严格执行公共安全政策,保证了人民的生命安全,全力遏制了2019-nCoV的传播,夺取了战“疫”的最终胜利。
关键词:新型冠状病毒;Python;数据可视化;趋势
新型冠状病毒(2019-nCoV)是一种β属的冠状病毒,自2019年12月在湖北省武汉市发现 2019-nCoV以来,疫情快速蔓延[1]。国家卫生健康委员会疫情通报显示,截至 2020年4月25日早上9点,累计确诊人数 82816人,累计治愈出院病例77346例,累计死亡病例4632例[2]。为快速抑制病情蔓延,国家已出台多种举措,如延长春节假期、企业延迟复工、学校延期开学、限制出行、公共场所要佩戴口罩,居家隔离等。本文基于Python,通过网络爬虫技术收集2019-nCoV疫情数据,通过数据可视化手段,给出疫情的地图分布,全国疫情新增趋势,全国累计/疑似趋势,全国累计治愈/死亡趋势,全国实时疫情概览表等。
1 对象与方法
1.1 数据来源
本文疫情发展数据取自中国疾病预防控制中心周报(以下简称中国疾控中心周报)和丁香园,其地址参看“参考文献”中的[2]和[3]。随着2019-nCoV的快速传播,自1月25日开始,各地纷纷启动“重大突发公共卫生事件Ⅰ级响应”,因此我们认定从1月25 日开始,病毒即进入传播状态。由于数据是从中国疾病预防控制中心周报中读取,比较完整的数据是从1月29日开始,因此,本次采集的数据就是从1月29日开始,直至4月25日零点。
1.2 疫情数据提取的需求
设计疫情数据提取的代码要解决的以下几个问题:
(1)下载网页:根据给定的URL下载其HTML网页。
(2)网页解析:根据网页结构信息,提取网页数据。
(3)数据存储:把从网页中解析出来的数据CSV文件中。
1.3 疫情数据提取的實现方法
(1)HTML下载器
本次设计使用requests库和requests-html库来下载网页,分别使用requests来下载中国疾病预防控制中心周报的数据,使用requests-html来下载丁香园的数据。使用requests-html下载网页的核心代码如下所示:
import requests
url = 'http://weekly.chinacdc.cn/news/TrackingtheEpidemic.htm'
r = requests.get(url) #下载网页
使用requests-html下载网页的核心代码如下所示:
from requests_html import HTMLSession
dxyurl = 'https://3g.dxy.cn/newh5/view/pneumonia'
response = HTMLSession.get(dxyurl) #下载网页
(2)HTML解析器
Python使用BeautifulSoup来进行HTML的解析,提取目标数据。在中国控制中心周报中,我们使用BeautifulSoup直接读取其注释部分,而不是按行读取目标数据所在的XPath。在中国控制中心周报网页中,目标文本是位于标签<div class="box-article-content">中的注释文本。通过分析中国控制中心周报网页数据结构,我们可以通过分割</p>标签,同时为了数据的提取,还要把</p>标签添加回原来的数据项中。提取数据的代码如下:
soup = BeautifulSoup(page,'html.parser')
content = soup.find_all("div",'box-article-content') #数据返回为列表
content_to_string = str(content) #将列表转换成字符串,使用正则表达式提取
pattern = re.compile(r"<!--(.*?)-->") # 抽取<!--(.*?)-->中间的文本
通过构建正则表达式,提取网页中的疫情数据。提取的疫情数据分别为日期、新增确诊/疑似病例、累计确诊/现存疑似病例、新增死亡/治愈人数、累计死亡/治愈人数。其正则表达式的构建如下所示:
date_regex = r"<a href=\"#NHC\w.*?\">(.*?)<" #提取日期的正则表达式
conf_suspe_data_regex = r"<p >Confirmed cases:(.*?)new,(.*?)total. Suspected cases:(.*?)new,(.*?)total.<" #提取新增确诊/疑似病例、累计确诊/现存疑似病例的正则表达式 dea_reco_data_regex = r"<p >Deaths:(.*?)new,(.*?)total. Recoveries:(.*?)new,(.*?)total.<" #提取新增死亡/治愈人数、累计死亡/治愈人数的正则表达式
在丁香园的网页中,通过查看网页元素,我们可以看到,目标数据在标签<script script id="getAreaStat">中,其数据以“[”开始,以"]},"结束,所以可以按照"]},"的格式进行分割,其提取的核心代码如下所示:
items = temp.split("]},") #按“]},”进行分割
对在丁香园中提取的数据进行格式化,使用JSON读取目标字符串,再进行格式转换成字典,使用字典提取目标数据中的省份相关数据,实现对数据的进一步读取,为后面的存储在CSV文件中做好准备,其实现的核心代码如下:
js = json.loads(item)
# 格式转换:JSON->字典
dc = {}
dc = dict(js)
# 省份数据(含城市)
self.province_list.append(dc)
2 前端设计
前端设计的作用是把数据可视化显示在前端页面上。echarts是一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器。使用echart有三个步骤,其一是在页面中指定一個div并指定宽高;其二是在页面中引用JS脚本;其三是在页面加载完毕后调用代码初始化option,其核心代码如下所示:
<div id="map" style="width:1024px;height:600px;"></div>
<script>
$(
function(){
#为ECharts准备一个具备大小(宽高)的DOM
var chart = echarts.init(document.getElementById('map'),'white',{renderer:'canvas'});#一个div只能有一个实例
$.ajax({
type:"GET",#请求页面时使用get方法
url:"http://127.0.0.1:5000/mapChart",#指定文件的路径
dataType:'json',
success:function(result){
chart.setOption(result);#指定图表的配置项和数据
} });})
</script>
这部分需要在后端代码中添加相应的文件路径,实现前后端的关联。在根目录处需要添加index.html文件其核心代码如下的示:
@app.route("/")
def index():
content = table_base()
return render_template("index.html",content=content)
使用pyecharts用于生成 Echarts 图表之后,也要添加相应的URL才能展示在前端上,其核心代码如下所示:
@app.route("/mapChart") #对应文件添加URL,此处文件为中国地图
def get_map_chart( ):
c = map_base( )
return c.dump_options_with_quotes( )
对于其他使用pyecharts生成的图表,包括新增死亡/治愈、累计确诊/疑似、累计死亡/治愈的发展曲线,都是使用前后端关联的方法,展示到前端页面上,使结果直观呈现出来。
3 结果
3.1 全国疫情地图分布
使用pyecharts生成的地图信息如下,从图中我们可以看到省份在这次疫情中的数据分布,本次采集显示的数据分别为确诊人数、治愈人数和死亡人数。
3.2 全国新增确诊/疑似发展曲线
使用pyecharts生成的新增确诊/疑似发展曲线如下图所示:
4 讨论
本文应用Python进行对数据的爬取,根据中国疾控中心周报和丁香园中的数据生成显示图表,得出本次疫情相关数据的走势图,并结合实际生活中情况,可以看到:在春运的期间,新冠病毒在人口迁移过程中出现大规模的传播。经过3个多月的抗“疫”战争,病毒被成功遏制,处于可控范围内,为世界防疫工作做出了一个典范,但防疫工作仍不可松懈,在常态化的防控疫情的情况下,继续要严格依照国家公共卫生政策,做好持久化防疫的做准备,守住抗“疫”胜利的果实。
参考文献
[1] 耿辉,徐安定,王晓艳,张勇,尹小妹,马茂,吕军.基于SEIR模型分析相关干预措施在新型冠状病毒肺炎疫情中的作用[J/OL].暨南大学学报(自然科学与医学版):1-7[2020-04-26].http://kns.cnki.net/kcms/detail/44.1282.n.20200214.1318.002.html.
[2] 中国疾病预防控制中心.CCDCWeekly[EB/OL].[2020-0426].http://weekly.chinacdc.cn/news/TrackingtheEpidemic.htm.
[3] 丁香园. [EB/OL].[2020-04-26].https://ncov.dxy.cn/ncovh5/view/pneumonia.
[4] 范传辉. Python爬虫开发与项目实践[M].北京:机械工业出版社. 2017.6:140-146
关键词:新型冠状病毒;Python;数据可视化;趋势
新型冠状病毒(2019-nCoV)是一种β属的冠状病毒,自2019年12月在湖北省武汉市发现 2019-nCoV以来,疫情快速蔓延[1]。国家卫生健康委员会疫情通报显示,截至 2020年4月25日早上9点,累计确诊人数 82816人,累计治愈出院病例77346例,累计死亡病例4632例[2]。为快速抑制病情蔓延,国家已出台多种举措,如延长春节假期、企业延迟复工、学校延期开学、限制出行、公共场所要佩戴口罩,居家隔离等。本文基于Python,通过网络爬虫技术收集2019-nCoV疫情数据,通过数据可视化手段,给出疫情的地图分布,全国疫情新增趋势,全国累计/疑似趋势,全国累计治愈/死亡趋势,全国实时疫情概览表等。
1 对象与方法
1.1 数据来源
本文疫情发展数据取自中国疾病预防控制中心周报(以下简称中国疾控中心周报)和丁香园,其地址参看“参考文献”中的[2]和[3]。随着2019-nCoV的快速传播,自1月25日开始,各地纷纷启动“重大突发公共卫生事件Ⅰ级响应”,因此我们认定从1月25 日开始,病毒即进入传播状态。由于数据是从中国疾病预防控制中心周报中读取,比较完整的数据是从1月29日开始,因此,本次采集的数据就是从1月29日开始,直至4月25日零点。
1.2 疫情数据提取的需求
设计疫情数据提取的代码要解决的以下几个问题:
(1)下载网页:根据给定的URL下载其HTML网页。
(2)网页解析:根据网页结构信息,提取网页数据。
(3)数据存储:把从网页中解析出来的数据CSV文件中。
1.3 疫情数据提取的實现方法
(1)HTML下载器
本次设计使用requests库和requests-html库来下载网页,分别使用requests来下载中国疾病预防控制中心周报的数据,使用requests-html来下载丁香园的数据。使用requests-html下载网页的核心代码如下所示:
import requests
url = 'http://weekly.chinacdc.cn/news/TrackingtheEpidemic.htm'
r = requests.get(url) #下载网页
使用requests-html下载网页的核心代码如下所示:
from requests_html import HTMLSession
dxyurl = 'https://3g.dxy.cn/newh5/view/pneumonia'
response = HTMLSession.get(dxyurl) #下载网页
(2)HTML解析器
Python使用BeautifulSoup来进行HTML的解析,提取目标数据。在中国控制中心周报中,我们使用BeautifulSoup直接读取其注释部分,而不是按行读取目标数据所在的XPath。在中国控制中心周报网页中,目标文本是位于标签<div class="box-article-content">中的注释文本。通过分析中国控制中心周报网页数据结构,我们可以通过分割</p>标签,同时为了数据的提取,还要把</p>标签添加回原来的数据项中。提取数据的代码如下:
soup = BeautifulSoup(page,'html.parser')
content = soup.find_all("div",'box-article-content') #数据返回为列表
content_to_string = str(content) #将列表转换成字符串,使用正则表达式提取
pattern = re.compile(r"<!--(.*?)-->") # 抽取<!--(.*?)-->中间的文本
通过构建正则表达式,提取网页中的疫情数据。提取的疫情数据分别为日期、新增确诊/疑似病例、累计确诊/现存疑似病例、新增死亡/治愈人数、累计死亡/治愈人数。其正则表达式的构建如下所示:
date_regex = r"<a href=\"#NHC\w.*?\">(.*?)<" #提取日期的正则表达式
conf_suspe_data_regex = r"<p >Confirmed cases:(.*?)new,(.*?)total. Suspected cases:(.*?)new,(.*?)total.<" #提取新增确诊/疑似病例、累计确诊/现存疑似病例的正则表达式 dea_reco_data_regex = r"<p >Deaths:(.*?)new,(.*?)total. Recoveries:(.*?)new,(.*?)total.<" #提取新增死亡/治愈人数、累计死亡/治愈人数的正则表达式
在丁香园的网页中,通过查看网页元素,我们可以看到,目标数据在标签<script script id="getAreaStat">中,其数据以“[”开始,以"]},"结束,所以可以按照"]},"的格式进行分割,其提取的核心代码如下所示:
items = temp.split("]},") #按“]},”进行分割
对在丁香园中提取的数据进行格式化,使用JSON读取目标字符串,再进行格式转换成字典,使用字典提取目标数据中的省份相关数据,实现对数据的进一步读取,为后面的存储在CSV文件中做好准备,其实现的核心代码如下:
js = json.loads(item)
# 格式转换:JSON->字典
dc = {}
dc = dict(js)
# 省份数据(含城市)
self.province_list.append(dc)
2 前端设计
前端设计的作用是把数据可视化显示在前端页面上。echarts是一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器。使用echart有三个步骤,其一是在页面中指定一個div并指定宽高;其二是在页面中引用JS脚本;其三是在页面加载完毕后调用代码初始化option,其核心代码如下所示:
<div id="map" style="width:1024px;height:600px;"></div>
<script>
$(
function(){
#为ECharts准备一个具备大小(宽高)的DOM
var chart = echarts.init(document.getElementById('map'),'white',{renderer:'canvas'});#一个div只能有一个实例
$.ajax({
type:"GET",#请求页面时使用get方法
url:"http://127.0.0.1:5000/mapChart",#指定文件的路径
dataType:'json',
success:function(result){
chart.setOption(result);#指定图表的配置项和数据
} });})
</script>
这部分需要在后端代码中添加相应的文件路径,实现前后端的关联。在根目录处需要添加index.html文件其核心代码如下的示:
@app.route("/")
def index():
content = table_base()
return render_template("index.html",content=content)
使用pyecharts用于生成 Echarts 图表之后,也要添加相应的URL才能展示在前端上,其核心代码如下所示:
@app.route("/mapChart") #对应文件添加URL,此处文件为中国地图
def get_map_chart( ):
c = map_base( )
return c.dump_options_with_quotes( )
对于其他使用pyecharts生成的图表,包括新增死亡/治愈、累计确诊/疑似、累计死亡/治愈的发展曲线,都是使用前后端关联的方法,展示到前端页面上,使结果直观呈现出来。
3 结果
3.1 全国疫情地图分布
使用pyecharts生成的地图信息如下,从图中我们可以看到省份在这次疫情中的数据分布,本次采集显示的数据分别为确诊人数、治愈人数和死亡人数。
3.2 全国新增确诊/疑似发展曲线
使用pyecharts生成的新增确诊/疑似发展曲线如下图所示:
4 讨论
本文应用Python进行对数据的爬取,根据中国疾控中心周报和丁香园中的数据生成显示图表,得出本次疫情相关数据的走势图,并结合实际生活中情况,可以看到:在春运的期间,新冠病毒在人口迁移过程中出现大规模的传播。经过3个多月的抗“疫”战争,病毒被成功遏制,处于可控范围内,为世界防疫工作做出了一个典范,但防疫工作仍不可松懈,在常态化的防控疫情的情况下,继续要严格依照国家公共卫生政策,做好持久化防疫的做准备,守住抗“疫”胜利的果实。
参考文献
[1] 耿辉,徐安定,王晓艳,张勇,尹小妹,马茂,吕军.基于SEIR模型分析相关干预措施在新型冠状病毒肺炎疫情中的作用[J/OL].暨南大学学报(自然科学与医学版):1-7[2020-04-26].http://kns.cnki.net/kcms/detail/44.1282.n.20200214.1318.002.html.
[2] 中国疾病预防控制中心.CCDCWeekly[EB/OL].[2020-0426].http://weekly.chinacdc.cn/news/TrackingtheEpidemic.htm.
[3] 丁香园. [EB/OL].[2020-04-26].https://ncov.dxy.cn/ncovh5/view/pneumonia.
[4] 范传辉. Python爬虫开发与项目实践[M].北京:机械工业出版社. 2017.6:140-146