国内疫情得到控制后,我就没怎么再关心过疫情,最近看到一条新闻,全球疫情累计确诊人数已经突破 500w 大关,看到这个数字我还是有点吃惊的。

思来想去,还是写一篇全球疫情的分析的文章,本文包括网络爬虫、全球疫情地图绘制等方面。

网络爬虫

我之前有分享过疫情数据的来源,用的是 AKShare 的数据源,好用是真好用,就是网络太慢了, AKShare 的数据很多是来源于 GitHub ,我的网络访问太平洋彼岸的数据还是有点力不从心。

这次我换了新的数据源,来源腾讯新闻的实时数据,站点链接如下:

本来我以为需要解析页面元素,才能获取到数据,但是等我分析了 network 以后发现,竟然可以直接找到数据接口,这大大的方便了我们数据抓取。

获取全球疫情数据接口如下:

https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist

把这个接口放在 PostMan 里面模拟访问一下:

毫无反爬手段,header 神马的都不需要配置,直接访问就能拿到数据,到这里,我们可以开始写爬虫的代码了,最终代码如下:

import requests
from datetime import datetime def catch_data():
"""
抓取当前实时数据,并返回 国家、大洲、确诊、疑似、死亡、治愈 列表
:return:
"""
url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'
data = requests.post(url).json()['data'] date_list = list() # 日期
name_list = list() # 国家
continent_list = list() # 大洲
confirm_list = list() # 确诊
suspect_list = list() # 疑似
dead_list = list() # 死亡
heal_list = list() # 治愈 for item in data:
month, day = item['date'].split('.')
date_list.append(datetime.strptime('2020-%s-%s' % (month, day), '%Y-%m-%d'))
name_list.append(item['name'])
continent_list.append(item['continent'])
confirm_list.append(int(item['confirm']))
suspect_list.append(int(item['suspect']))
dead_list.append(int(item['dead']))
heal_list.append(int(item['heal'])) return date_list, name_list, continent_list, confirm_list, suspect_list, dead_list, heal_list def save_csv():
"""
将数据存入 csv 文件
:return:
"""
date_list, name_list, continent_list, confirm_list, suspect_list, dead_list, heal_list = catch_data()
fw = open('2019-nCoV.csv', 'w', encoding='utf-8')
fw.write('date,name,continent,confirm,suspect,dead,heal\n') i = 0
while i < len(date_list):
date = str(date_list[i].strftime("%Y-%m-%d"))
fw.write(date + ',' + str(name_list[i]) + ',' + str(continent_list[i]) + ',' + str(confirm_list[i]) + ',' + str(suspect_list[i]) + ',' + str(dead_list[i]) + ',' + str(heal_list[i]) + '\n')
i = i + 1
else:
print("csv 写入完成")
fw.close() if __name__ == '__main__':
save_csv()

最终得到的 csv 文件是这样的:

全球疫情地图

前端或网站开发的朋友应该都使用过强大的 Echarts 插件。 ECharts 是一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器,底层依赖轻量级的 Canvas 类库 ZRender ,提供直观、生动、可交互、可高度个性化定制的数据可视化图表。 ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap,多维数据可视化的平行坐标,还有用于 BI 的漏斗图、仪表盘,并且支持图与图之间的混搭。

既然 Echarts 如此强大, Python 肯定有相应的第三方扩展包支持,它就是我们接下来绘制世界地图要用到的 PyEcharts 。 PyEcharts 是一个用于生成 Echarts 图表的类库,即 Echarts 与 Python 的对接。

安装语句如下:

pip install pyecharts

PyEcharts 安装完成后我们就可以开始写接下来的代码了,如下:

from pyecharts import options as opts
from pyecharts.charts import Map
import pandas as pd
import namemap def read_country_code():
"""
获取国家中英文字典
:return:
"""
country_dict = {}
for key, val in namemap.nameMap.items(): # 将 nameMap 列表里面键值互换
country_dict[val] = key
return country_dict def read_csv():
"""
读取数据,返回国家英文名称列表和累计确诊数列表
:return:
"""
country_dict = read_country_code()
data = pd.read_csv("2019-nCoV.csv", index_col=False) countrys_names = list()
confirmed_count = list() for x in range(len(data.index)):
if data['name'].iloc[x] in country_dict.keys():
countrys_names.append(country_dict[data['name'].iloc[x]])
confirmed_count.append(data['confirm'].iloc[x])
else:
print(data['name'].iloc[x]) return countrys_names, confirmed_count def draw_map():
"""
绘制世界地图
遇到一个很神奇的问题:
两个列表必须写死数据地图才会渲染数据,如果数据是从方法中获得,则地图不渲染数据
:return:
""" # countrys_names, confirmed_count = read_csv()
# print(countrys_names)
# print(confirmed_count) countrys_names = ['United States', 'Brazil', 'Russia'...] confirmed_count = [1666828, 347398, 335882...] c = (
Map()
.add(
"确诊人数",
[list(z) for z in zip(countrys_names, confirmed_count)],
is_map_symbol_show=False,
maptype="world",
label_opts=opts.LabelOpts(is_show=False),
itemstyle_opts=opts.ItemStyleOpts(color="rgb(49,60,72)")
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="全球 2019-nCoV 地图"),
visualmap_opts=opts.VisualMapOpts(max_=1700000),
)
.render("map_world.html")
) if __name__ == '__main__':
draw_map()

最终结果如下:

在绘制全球疫情地图的时候,我们最终使用的国家的名称是英文的,所以需要用到一个中英文国家名称对照字典,这个字典我找到了两个版本,一个是 Python 格式的文件 namemap.py ,还有一个是 json 格式的文件 country-code.json , 使用这两个文件中的任意一个将我们在前面获取到的数据中的中文国家名称转换为英文。这两个文件我都会提交到代码仓库,有需要的同学可以在公众号里回复关键字获取。

另外,在最后绘制地图的时候遇到了一个很奇葩的问题,国家名称列表和累计确诊人数列表如果是从前面的方法中获取到的,在最后渲染成 map_world.html 的时候,将不会渲染数字,所有的数字都是 null ,但是如果这两个列表 copy 出来,写死在代码中,就可以成功的渲染,有清楚这个问题的朋友可以在留言中解答一下,万分感激。

需要源代码的同学可以在公众号后台回复「全球疫情」获取。

Python 绘制全球疫情地图的更多相关文章

  1. 用Python绘制全球疫情变化地图

    目前全球疫情仍然比较严重,为了能清晰地看到疫情爆发以来至现在全球疫情的变化趋势,我绘制了一张疫情变化地图,完整代码共 230 行,需要的朋友在公众号回复关键字 疫情地图 即可. 废话不多说,先上图 下 ...

  2. 【疫情动态条形图】用Python开发全球疫情排名动态条形图bar_chart_race

    一.开发背景 你好,我是 @马哥python说 ,这是我用Python开发的全球疫情动态条形图,演示效果: https://www.zhihu.com/zvideo/15603276220259696 ...

  3. 如何用 Python 绘制玫瑰图等常见疫情图

    新冠疫情已经持续好几个月了,目前,我国疫情已经基本控制住了,而欧美国家正处于爆发期,我们会看到很多网站都提供了多种疫情统计图,今天我们使用 Python 的 pyecharts 框架来绘制一些比较常见 ...

  4. Python爬取全球疫情数据,实现可视化显示地图数据(附代码)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 武汉地区,目前已经实现住院患者清零了,国内疫情已经稳定,然而中国以外新冠确 ...

  5. python绘制疫情图

    python中进行图表绘制的库主要有两个:matplotlib 和 pyecharts, 相比较而言: matplotlib中提供了BaseMap可以用于地图的绘制,但是个人觉得其绘制的地图不太美观, ...

  6. 带大家用40行python代码实现一个疫情地图

    最近两个月,因为新冠病毒无情的肆虐,相信会给每个中国人的记忆中画上重重的一笔.到今天为止,疫情形势依然十分严峻,虽然除湖北外的其他省份已经连续十一天确诊人数下降,但是接下来还有将近至少1.6亿的人口迁 ...

  7. 【实战】通过Python实现疫情地图可视化

    目录 一. json模块 二.通过Python实现疫情地图可视化 2.将json格式的数据保存到Excel 3.应用pyecharts进行数据可视化 一. json模块 JSON(JavaScript ...

  8. GeoDa绘制疫情地图

    刚学习GeoDa,菜鸟,目前还不能在地图上显示省市名称,求教. 看到丁香医生发布的疫情地图,我也尝试做一下,不过我的shp文件上只有中国大陆的31个省市. 数据来源于丁香医生,截至时间为 2020.1 ...

  9. 用python画出全球疫情趋势变化图

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:谦睿科技 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

随机推荐

  1. 解决iframe跨域刷新的问题

    用iframe的location.reload(true); 方法来刷新外部URL会报 Blocked a frame with origin xxxx from accessing a cross- ...

  2. P3306 [SDOI2013]随机数生成器(bzoj3122)

    洛谷 bzoj 特判+多测真恶心 . \(0\le a\le P−1,0\le b\le P−1,2\le P\le 10^9\) Sample Input 3 7 1 1 3 3 7 2 2 2 0 ...

  3. 题目分享V

    题意:现在两个人做游戏,每个人刚开始都是数字1,谁赢了就能乘以k^2,输的乘以k(k可以是任意整数,每次不一定相同)现在给你最终这两个人的得分,让你判断是否有这个可能,有可能的话Yes,否则No. 分 ...

  4. MySQL 基础入门

    MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用 ...

  5. 学习Vue第四节,v-model和双向数据绑定

    Vue指令之v-model和双向数据绑定 <!DOCTYPE html> <html> <head> <meta charset="utf-8&qu ...

  6. P2762 太空飞行计划问题 网络流

    题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的 ...

  7. mui指南

    转自https://www.cnblogs.com/koleyang/p/5146623.html http://dev.dcloud.net.cn/mui/ui/index.html#mask ht ...

  8. Spring官网阅读(九)Spring中Bean的生命周期(上)

    文章目录 生命周期回调 1.Bean初始化回调 2.Bean销毁回调 3.配置默认的初始化及销毁方法 4.执行顺序 5.容器启动或停止回调 Lifecycle 接口 LifecycleProcesso ...

  9. 字节码编程,Byte-buddy篇一《基于Byte Buddy语法创建的第一个HelloWorld》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 相对于小傅哥之前编写的字节码编程: ASM.Javassist 系列,Byte Bu ...

  10. [hdu5392 Infoplane in Tina Town]置换的最小循环长度,最小公倍数取模,输入挂

    题意:给一个置换,求最小循环长度对p取模的结果 思路:一个置换可以写成若干循环的乘积,最小循环长度为每个循环长度的最小公倍数.求最小公倍数对p取模的结果可以对每个数因式分解,将最小公倍数表示成质数幂的 ...