2019新型冠状病毒(2019-nCoV), [1] 因2019年武汉病毒性肺炎病例而被发现,2020年1月12日被世界卫生组织命名。冠状病毒是一个大型病毒家族,已知可引起感冒以及中东呼吸综合征(MERS)和严重急性呼吸综合征(SARS)等较严重疾病。新型冠状病毒是以前从未在人体中发现的冠状病毒新毒株。 [2-3]
2019年12月以来,湖北省武汉市持续开展流感及相关疾病监测,发现多起病毒性肺炎病例,均诊断为病毒性肺炎/肺部感染。 [4]
人感染了冠状病毒后常见体征有呼吸道症状、发热、咳嗽、气促和呼吸困难等。在较严重病例中,感染可导致肺炎、严重急性呼吸综合征、肾衰竭,甚至死亡。目前对于新型冠状病毒所致疾病没有特异治疗方法。但许多症状是可以处理的,因此需根据患者临床情况进行治疗。
本人初学爬虫不久,具体也不是特别的熟练,正好碰上了这次疫情,故想试一试爬一下网上的数据,练一下手。本次参考的大佬会在文章末尾放出,有兴趣的话也可以去看一下大佬的博客。若是有什么地方说的不好的或者错误的,也欢迎大家指出。(第一次写博客,瑟瑟发抖)
这次爬取数据的话主要是从几个比较出名的网络平台爬的,接口的话可以参考大佬们的链接,如果你有前端的经验的话也可以自己F12在网页里在JS类型里查找,这里就不再赘述了。
想要爬取数据的话需要引入requests库,若要使用到正则表达式去匹配的话还要用到re库,想要用其他的爬取方法的话,也可以用bs4库等等,因人而异吧,能够爬到数据就好。
要使用到正则表达式的操作,故这里给出一些正则化的常用操作符
正则表达式的语法可以参考:
正则表达式语法
https://www.runoob.com/regexp/regexp-syntax.html
由于爬取的网站没有反爬虫的设定,爬取起来也很轻松。
代码如下:
result = requests.get(
'https://interface.sina.cn/news/wap/fymap2020_data.d.json?1580097300739&&callback=sinajp_1580097300873005379567841634181')
json_str = re.search("\(+([^)]*)\)+", result.text).group(1)
html = f"{json_str}"
table = json.loads(f"{html}")
爬取之后我们debug一下,看看具体的数据结构是怎么样的:
这里我们可以看到我们数据更新的时间以及各种疫情相关的数据。看来我们成功爬取到了疫情数据。接下来便是绘制疫情地图以及其他数据可视化的事情了。
由三位大佬制作的项目pyecharts对数据可视化有着很好的应用,当然用matplotlib或者其他库进行数据可视化也是可以的,但是个人还是更加喜欢用pyecharts,所以这次便用这个来绘制疫情图以及各种曲线图。
直接使用python的pip安装即可
选择自己需要的安装的地图
$ pip install echarts-countries-pypkg
$ pip install echarts-china-provinces-pypkg
$ pip install echarts-china-cities-pypkg
$ pip install echarts-china-counties-pypkg
$ pip install echarts-china-misc-pypkg
$ pip install echarts-united-kingdom-pypkg
————————————————
同时我们在这里给出pyecharts的使用手册
https://pyecharts.org/#/zh-cn/intro
def draw_china_map():
"""获取数据"""
data = []
for province in d_list['data']['list']:
data.append((province['name'], province['value']))
c=(
Map()
.add("确诊",data, "china")
.set_global_opts(title_opts=opts.TitleOpts(title="全国疫情图"),
visualmap_opts = opts.VisualMapOpts(max_=800))
)
c.render("全国实时疫情.html") # 生成html文件
return c
这边需要注意一下,在使用连续型地图的时候,max可以设计地区渲染的阈值,具体见效果图。
3. 绘制广东省实时疫情图
同样的,我们可以绘制出各个省的实时疫情图:
def draw_guangdong_daily():
data = []
for city in d_list['data']['list'][2]['city']:
data.append((city['name']+'市', city['conNum']))
c=(
Map()
.add("确诊",data, "广东")
.set_global_opts(title_opts=opts.TitleOpts(title="广东疫情图"),
visualmap_opts = opts.VisualMapOpts(max_=200))
)
c.render("广东疫情.html") # 生成html文件
return c
当然,如果你想的话,你还可以绘制全球的疫情图,但是由于数据中国家的名字都是中文,而地图包中的国家名字为英文,故我们需要世界各个国家中英文对照的数据集进行匹配,这里我就不赘述了,后面会给大家看到效果图
4. 绘制全国疫情发展曲线
首先,我们获取需要的数据:
def catch_daily():
"""抓取每日疫情数据"""
date_list = list() # 日期
confirm_list = list() # 确诊
suspect_list = list() # 疑似
dead_list = list() # 死亡
heal_list = list() # 治愈
for count in d_list['data']['historylist']:
date_list.append(count['date'])
confirm_list.append(count['cn_conNum'])
heal_list.append(count['cn_cureNum'])
suspect_list.append(count['cn_susNum'])
dead_list.append(count['cn_deathNum'])
return date_list, confirm_list, suspect_list, dead_list, heal_list
然后我们将数据添加到折线图line类中:
def draw_daily():
"""绘制全国疫情曲线图"""
date_list, confirm_list, suspect_list, dead_list, heal_list = catch_daily() # 获取数据
date_list.reverse()
confirm_list.reverse()
dead_list.reverse()
heal_list.reverse()
suspect_list.reverse()
line = Line()
line.set_global_opts(title_opts=opts.TitleOpts(title="全国疫情曲线"))
line.add_xaxis(date_list)
line.add_yaxis('确诊人数', confirm_list)
line.add_yaxis('疑似人数', suspect_list )
line.add_yaxis('死亡人数', dead_list)
line.add_yaxis('治愈人数', heal_list)
line.render("全国实时疫情曲线.html")
return line
tab = Tab()
tab.add(draw_china_map(), "全国实时疫情地图")
tab.add(draw_guangdong_daily(), "广东疫情地图")
tab.add(draw_global(), "世界疫情")
tab.add(draw_daily(), "全国疫情曲线")
tab.add(draw_wuhan_daily(), "武汉疫情曲线")
tab.render('2019-cNov.html')
打开第一个文件,便可以看到我们具体的效果如何
全国实时疫情图
广东省疫情图
世界疫情图
全国疫情曲线
武汉疫情曲线
小结:在本文章中,用python爬取了网络数据,进行了数据可视化,也许虽然不能对国家疫情抗战做出多大贡献,但也希望早日能够战胜病毒,让人们重新正常的生活。为国家疫情抗战一线的工作人员加油!
参考博客:
https://www.jianshu.com/p/c773289c0bb1
你的点赞是我最大的动力❤