NCP | 新冠疫情的监测与趋势分析
1. 前言 🇨🇳
1.1 项目阐述
👨🏻💻 2020,注定是不平凡的一年,新冠疫情如晴天霹雳将沉浸在2020年春节气氛中的人们骤然推进人人自危的疫情防控中,新冠疫情的肆虐,使得我们每一个人都无法独善其身。
在国内疫情最严重的二月春节期间,我每天都在关注着最新的疫情动态,看着日趋增长的确诊人数,以及「每日一千两千甚至是三千的新增确诊人数」,我总是在想,「到底什么时候才能挺过去啊?这一场艰难的抗疫,到底什么时候才能迎来转机?」很快,国家政府和全国的医护人员用最实际的行动,给了我们最肯定的答案。
面对这一场突如其来的危机,幸亏有强大的国家和政府,使我们大部分人平稳度过疫情的爆发期,在从「一月初疫情爆发到二月底不到两个月」的时间里,实施了最有效的措施,「并在三月将新增确诊的数目减到了两位数」。与此同时,面对海外疫情泛滥的波涛汹涌之势,面对海外民众的束手无策和听天由命之悲,生活在中国的人都暗暗庆幸自己不在海外。那一刻,真为自己身为国人而自豪。
「数据是冷冰冰的,但是,借由数据,我们可以看到这场战疫背后透露出来的温暖人情、英雄气概」,也只有亲身经历过这一场战役的我们,才深深懂得这一条「逐渐归于直线的确诊曲线」,来的有多么不容易。
本项目围绕疫情的几个关键特征(如确诊、治愈、死亡),绘制折线图,并在GUI图形页面进行交互与显示图表。
1.2 使用方式
- 使用命令
source ./venv/bin/activate
激活项目下的虚拟环境,即可运行 - 使用命令
pip install -r requirements.txt
安装依赖库 - 配置chromedriver - selenium各浏览器驱动下载地址
- 运行项目下的
main.py
文件
1.3 技术栈
- python - PyQt5、numpy、pandas、requests、pyecharts、matplotlib
2. 需求分析 🤫
2.1 功能需求分析
/功能简介/
/图形界面组件设计/
/图形界面示意图/
2.2 技术需求分析
🐛 数据爬取 - requests(一个requests吃遍天),由于是使用API的方式获取数据,因此只需要添加简单的请求头就可以轻松获取到数据。
🔍 数据分析 - numpy、pandas,请求返回的数据为json格式,采用pd.DataFrame()
将其处理并保存至csv文件。
📈 制作图表 - echarts、matplotlib,提供两种不同风格的图表,并生成网页图表(echarts)。
📃 图形页面 - PyQt5,极简风格,没有修饰。
2.3 API需求分析
数据来源这一块其实花了蛮多功夫去寻找,一开始看到「腾讯」做的还不错,问题是国内和国外的数据是不同的API,没办法一条API通吃,后来又看到「丁香园」的也很多开发者在用,再后来觉得还是正规的官方网站的数据比较靠谱,于是又去爬了「国家卫生健康委员会」的网站,而后发现与其他网站的数据出现了出入,不知道该信哪个…
再到后面国外疫情开始放飞自我,便开始萌生爬取国外疫情的想法,心里的想法觉得最官方的是「世界卫生组织」,于是也去爬了,可是得到的世卫组织的疫情信息是pdf文件的,就此作罢。这时又发现很多平台的数据来源都来自「霍普金斯大学」,去看了一番,,,算了,懒得爬。
另外,在GitHub也发现了「一个开发者提供的API」,使用体验一样很顺滑,只是没有国内疫情的历史数据 - https://lab.isaaclin.cn/nCoV/zh
综合下来,我选择了「腾讯」提供的API,API的获取方式大同小异,通过开发者工具即可,以腾讯为例:
/右键检查或F12进入到开发者界面,刷新一下/
/点击右边窗口的搜索图标,在输入框输入93004(左图中的数据),回车/
/即可得到这样一条请求,点开它,这就是我们想要的/
/点到header,这条请求就是我们要找的API接口,向他发送请求即可得到疫情数据/
下面是本项目用到的API:
- 国内数据
- 国内全局 -
https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=chinaDayList,chinaDayAddList,cityStatis,nowConfirmStatis,provinceCompare
- 国内实时 -
https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5
- 国内全局 -
https://view.inews.qq.com/g2/getOnsInfo?name=disease_other
- 国内省份及城市 -
https://api.inews.qq.com/newsqa/v1/query/pubished/daily/list?province={}&city={}&
- 国内全局 -
- 海外数据
- 海外全局 -
https://api.inews.qq.com/newsqa/v1/automation/modules/list?modules=FAutoGlobalStatis,FAutoContinentStatis,FAutoGlobalDailyList,FAutoCountryConfirmAdd
- 海外各国 -
https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country={}&
- 海外全局 -
3. 开发过程 💻
其实在很早之前就在做疫情这个项目了,那时候还是二三月份国内形势最严峻的时候,在这个过程中,爬过很多平台的疫情数据,也因此触类旁通到很多爬取方法和思路,有了数据之后开始制作图表,各个模块之间存在比较分散的问题。
一直到最近,加入了GUI图形界面,进一步提高了交互效率,也将各个功能模块、各个不同地区的爬取模块,整合到一个系统的解决方案当中,以一个个的py文件分布其职责,加上开发文档的编写,才终于算填了一个大坑,了了一桩心事。
算了一下,整个开发周期长达大半年,功能架构早已完成,中间被很多事情耽搁过,近日才重新拾起,随着此篇文档的编写终于大功告成。后面会考虑加入更多丰富的echarts图表,如果还有这个精力和时间的话。
🐛 数据爬取 - 一开始爬的方法很笨拙,从页面的的网页文件中提取数据,也因此写了很多很多代码去详细设计其过程,效率较低,但锻炼了动手能力;而后善用了浏览器的开发者工具,通过分析得到其数据的API,进行数据的爬取。
🔍 数据分析 - DataFrame真的是太好用了!!!
📈 制作图表 - 老师傅matplotlib是一开始的制作图表不二选,后来觉得差点意思,不够灵动,就接触到了echarts这个神奇的库,可以制作很多效果极度炫酷的图表,后面会加入更多丰富种类的echarts图表。
📃 图形页面 - 很久开始五六月份的时候就开始有做GUI的想法了,那时使用过的图形界面相关模块如wxpython和tkinter,都不是特别满意,加上学业繁忙最终没能实现,近日帮同学做项目接触到了pyqt,让我吃一斤的是这个模块的控件竟然支持css样式进行美化,便边学边用做了个,顺便给自己这个项目加上了图形界面,才有了现在这个,不追求太多花哨的样式,但求直观简单明了,一眼就能对功能一目了然,图表的显示也符合自己的预期。
4. issue截图 🐰
/初始界面/
/查询结果界面/
/项目目录/
5. 后记 📝
在线图表(每日更新)
- china - https://download.chenxuefan.cn/NCP/china.html
- abroad - https://download.chenxuefan.cn/NCP/abroad.html
- global - https://download.chenxuefan.cn/NCP/global.html
某hub地址 - https://github.com/chenxuefan/NCP