说明: 本文是Python可视化技术结合时下热点进行进行开发、讲解的案例,也课程思政的一个形式。文章遵守CSDN平台规定和国家法规(非新闻资质的网站不允许发布疫情数据),对运行结果(2020年2月8日)中涉及数据部分进行屏蔽,同时删除提供数据的网站链接。

文章目录

  • 运行结果(2020-2-8当天)
  • 基本方案
  • 数据格式
  • 全国疫情地图实现
  • 福建省疫情地图实现
  • 福州市疫情地图实现
  • 其他

运行结果(2020-2-8当天)



基本方案

  • web请求用requests
  • 网页内容解析用pyquery、beautifulsoup和正则表达式
  • 地图用pyecharts v1.6.2
  • 数据来源
    • 全国数据来源于“腾讯实时疫情动态网页”,直接get到json
    • 福州市数据来源于“福建省疾病预防控制中心官网”疫情通报页面,需要解析页面

数据格式

请参考本人其他两篇中的抓包分析过程
用Python抓新型冠状病毒肺炎实时数据,绘制市内疫情地图
用Python抓新型冠状病毒肺炎疫情数据,绘制全国疫情分布图

全国疫情地图实现

#%%import time, json, requests
import jsonpath
from pyecharts.charts import Map
import pyecharts.options as opts#%%# 全国疫情地区分布(各省确诊病例)
def catch_cn_disease_dis():timestamp = '%d'%int(time.time()*1000)url_area = ('https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5''&callback=&_=') + timestampworld_data = json.loads(requests.get(url=url_area).json()['data'])china_data = jsonpath.jsonpath(world_data, expr='$.areaTree[0].children[*]')ls_province_names = jsonpath.jsonpath(china_data, expr='$[*].name')ls_confirm_vals = jsonpath.jsonpath(china_data, expr='$[*].total.confirm')ls_province_confirm = list(zip(ls_province_names, ls_confirm_vals,))  return ls_province_confirm, world_data#%%ls_province_cfm, dic_world_data = catch_cn_disease_dis()
print(ls_province_cfm)#%%# 绘制全国疫情地图
def map_cn_disease_dis() -> Map:c = (Map().add('中国', ls_province_cfm, 'china').set_global_opts(title_opts=opts.TitleOpts(title='全国新型冠状病毒疫情地图(确诊数)'),visualmap_opts=opts.VisualMapOpts(is_show=True,split_number=6,is_piecewise=True,  # 是否为分段型pos_top='center',pieces=[{'min': 10000, 'color': '#7f1818'},  #不指定 max{'min': 1000, 'max': 10000},{'min': 500, 'max': 999},{'min': 100, 'max': 499},{'min': 10, 'max': 99},{'min': 0, 'max': 5} ],                                              ),))return c
map_cn_disease_dis().render('全国疫情地图.html')

福建省疫情地图实现

# 获取福建省确诊分布数据
def catch_fj_disease_dis():dic_world_data = catch_cn_disease_dis()[1]dic_fj_cfm = dict()    # 解析福建各个城市的数据dic_fj = jsonpath.jsonpath(dic_world_data, expr='$.areaTree[0].children[?(@.name=="福建")].children[*]') for item in dic_fj:if item['name'] not in dic_fj_cfm: dic_fj_cfm.update({item['name']:0})            dic_fj_cfm[item['name']] += int(item['total']['confirm'])   return dic_fj_cfm  dic_fj_cfm = catch_fj_disease_dis()#%%# 绘制福建省疫情地图
def map_fj_disease_dis() -> Map:# dic_fj_cfm = catch_fj_disease_disls_fj_cities = [name + '市' for name in dic_fj_cfm.keys()]c = (Map().add('福建省', [list(z) for z in zip(ls_fj_cities, dic_fj_cfm.values())], '福建').set_series_opts(label_opts=opts.LabelOpts(is_show=True, formatter='{b}\n{c}例')).set_global_opts(title_opts=opts.TitleOpts(title='福建新型冠状病毒疫情地图(确诊数)'),visualmap_opts=opts.VisualMapOpts(is_show=True,split_number=6,is_piecewise=True,  # 是否为分段型pos_top='center',pieces=[{'min': 50},  {'min': 30, 'max': 49},{'min': 20, 'max': 29},{'min': 10, 'max': 19},{'min': 1, 'max': 9},{'value': 0, "label": '无确诊病例', "color": 'green'} ],                                              ),))return c
map_fj_disease_dis().render('福建疫情地图.html')

福州市疫情地图实现

from pyquery import PyQuery as pq
from bs4 import BeautifulSoup
import datetime
import numpy as np
import re
# 获取福建省疾病预防控制中心官网疫情通告列表
def catch_fz_disease_rpt_list() -> str:    session = requests.session()crawl_timestamp = int(datetime.datetime.timestamp(datetime.datetime.now()) * 1000)keyword = {'txtkeyword':'福建省新增新型冠状病毒感染的肺炎疫情情况'}html = '' while True:try:rsp = session.get('http://www.fjcdc.com.cn/search', params=keyword)except requests.exceptions.ChunkedEncodingError:continuersp.raise_for_status()  # 非200则抛出异常(rsp.status_code != 200)html = rsp.contentbreak return html#%%html = catch_fz_disease_rpt_list()#%%# 获取最新一期的疫情通告链接地址
def catch_fz_disease_latest_rpt():    # html = catch_fz_disease_rpt_list()doc = pq(html)# 方法一:第一条数据,doc('.list li a').attr.href即可得到所要链接# 方法二:指定日期, doc('.list li:contains("2020-02-02") a').attr.href# 但是这里咱们多写点,练习嘛,乱写news = doc('.list li').items()dates = []for item in news:date_str = item('span').text().strip() date = datetime.datetime.strptime(date_str,'%Y-%m-%d')dates.append(date)temp = np.array(dates)latest_date = temp.max()latest_date_str = latest_date.strftime('%Y-%m-%d')latest_date_url = doc('.list li:contains("{0}") a'.format(latest_date_str)).attr.hreflatest_date_url = 'http://www.fjcdc.com.cn' + latest_date_urlreturn latest_date_url#%%
print(catch_fz_disease_latest_rpt())
#%%# 解析网页,获取确诊和疑似病例数据文本
def catch_fz_disease_dis():latest_date_url = catch_fz_disease_latest_rpt()soup = ''while True:try:rsp = requests.session().get(latest_date_url)except requests.exceptions.ChunkedEncodingError:continuersp.raise_for_status()  # 非200则抛出异常(rsp.status_code != 200)soup = BeautifulSoup(rsp.content, 'lxml')# print(soup)break reg = re.compile('.*福州市.*')soup = soup.find('div', class_='showCon')tag = soup.find_all(text=reg)if len(tag) != 4:raise Exception('查找到值的次数必须等于 4. 实际值为: {}'.format(len(tag))) area_data = {}# area_data.update({'confirm_added':tag[0]})      # area_data.update({'suspend_added':tag[1]})area_data.update({'confirm':tag[2]})      area_data.update({'suspend':tag[3]})return area_data
#%%
fz_data = catch_fz_disease_dis()
print(fz_data)
#%%
import re
# 解析各区县数据
def exact_towns_dis():  # fz_data = catch_fz_disease_dis()pattern = re.compile('(?<=、|()\D+[市|县|区]\d+例')town_list = pattern.findall(fz_data['confirm'])# town_list = fz_data['confirm'].split('(|(')[1].split('))')[0].split('、')# 平潭单列,不处理 town_data = {'福州市区':0} for town in town_list:match_num = re.search(r'\d+(?=例)', town)match_town_name = re.search(r'\D+[市|县|区]', town)if match_num and town:match_num = int(match_num.group())match_town_name = match_town_name.group()else:continueif match_town_name == '长乐区':  # 地图中长乐为市match_town_name = '长乐市'   town_data.update({match_town_name: match_num})  # 晋安、鼓楼、马尾、仓山、台江if match_town_name[-1] == '区' :  town_data['福州市区'] += match_numreturn town_data#%%
fz_town_data = exact_towns_dis()
print(fz_town_data)#%%
from pyecharts.commons.utils import JsCode
def map_fz_disease_dis() -> Map:# fz_town_data = exact_towns_dis()# ls_fz_towns = [name + '市' for name in fz_town_data.keys()]c = (Map().add('福州市(不含平潭)', [list(z) for z in zip(fz_town_data.keys(), fz_town_data.values())], '福州').set_series_opts(label_opts=opts.LabelOpts(is_show=True,#  return params.value[2]; // 不存在这个值,写个错误的让地图绘制默认值                                       formatter=JsCode("""function(params){                                                                                                         if (typeof(params.data) == 'undefined') {return params.value[2];  } else {                                             return params.data.name + params.data.value + '例';}                                                                                                                 }"""))) .set_global_opts(title_opts=opts.TitleOpts(title='福州市新型冠状病毒疫情地图',subtitle='其中,福州主城区(晋安、马尾、鼓楼、仓山、台江)\n共确诊{}例'.format(fz_town_data['福州市区'])),visualmap_opts=opts.VisualMapOpts(is_show=True,split_number=6,is_piecewise=True,  # 是否为分段型pos_top='center',pieces=[  {'min': 20},{'min': 10, 'max': 19},{'min': 5, 'max': 9},{'min': 1, 'max': 4}]                                             )))return c
#%%
map_fz_disease_dis().render('福州疫情地图.html')

其他

请参考本人其他篇绘制抓取实时数据,使用Basemap绘制分布图,使用plt绘制走势图的博文。

另外,pyecharts使用案例:
用Python pyecharts v1.x 绘制图形(一):柱状图、柱状堆叠图、条形图、直方图、帕累托图、饼图、圆环图、玫瑰图
用Python pyecharts v1.x 绘制图形(二):折线图、折线面积图、散点图、雷达图、箱线图、词云图

用Python爬取新型冠状病毒肺炎实时数据,pyecharts v1.x绘制省市区疫情地图相关推荐

  1. Python爬取新型冠状病毒新闻进行LDA主题分析-从概率的角度去看文学

    一.主题介绍 使用 Python 爬取冠状病毒新闻 使用 jieba 分词进行词频分析 使用 LDA 主题模型提取新闻话题 通过词频分析绘制词云图 二.爬取新闻数据 目标网站:人民新闻网 导入我们需要 ...

  2. 用Python抓新型冠状病毒肺炎实时数据,绘制市内疫情地图

    说明: 本文是Python可视化技术结合时下热点进行进行开发.讲解的案例,也是计算机编程课程思政的一个形式.文章遵守CSDN平台规定和国家法规(非新闻资质的网站不允许发布疫情数据),对运行结果图片中的 ...

  3. python如何爬取实时人流量_使用python爬取微信宜出行人流量数据

    代码地址:https://liujiao111.github.io/2019/06/18/easygo/ 工具介绍: 该工具基于微信中的宜出行提供的数据接口进行爬取,能够爬取一定范围内的当前时间点的人 ...

  4. python爬取股票信息_利用Python爬取网易上证所有股票数据(代码

    利用Python爬取网易上证所有股票数据(代码 发布时间:2018-04-14 17:30, 浏览次数:1261 , 标签: Python import urllib.request import r ...

  5. 如何使用python编程抢京东优惠券 知乎_学好Python爬取京东知乎价值数据

    原标题:学好Python爬取京东知乎价值数据 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这 ...

  6. 使用python爬取BOSS直聘岗位数据并做可视化(Boss直聘对网页做了一些修改,现在的代码已经不能用了)

    使用python爬取BOSS直聘岗位数据并做可视化 结果展示 首页 岗位信息 岗位详情 薪资表 学历需求 公司排名 岗位关键词 福利关键词 代码展示 爬虫代码 一.导入库 二.爬取数据 1.爬取数据代 ...

  7. python爬取火车票网的时刻表数据

    python爬取火车票网的时刻表数据 导包 import re,requests,datetime,time,json from prettytable import PrettyTable from ...

  8. 通过爬取天猫商品评论实例分析Python爬取ajax动态生成的数据

    本文主要通过爬取天猫商品kindle的评论为例来说明利用python爬取ajax动态生成的数据的方式,本文使用的工具如下: 工具 chrome浏览器[寻找评论的动态链接] python3.5[执行代码 ...

  9. python 爬取自如租房的租房数据,使用图像识别获取价格信息

    python 爬取自如租房的租房数据 完整代码下载:https://github.com/tanjunchen/SpiderProject/tree/master/ziru #!/usr/bin/py ...

最新文章

  1. Android中SQLite的使用
  2. 移动端调试利器------微信开源项目
  3. python3.7.2教程-centos7系统下python2与python3共存
  4. python保存到txt_python 如何将数据写入本地txt文本文件的实现方法
  5. 用Go语言建立一个简单的区块链part4(1):交易(1)
  6. 《云计算开放应用架构》标准发布,阿里云持续领航云原生
  7. How To Make JMeter Behave More Like A Real Browser
  8. 第三次学JAVA再学不好就吃翔(part11)--基础语法之switch语句
  9. 想提高运维效率,那就把MySQL数据库部署到Kubernetes 集群中
  10. 一款基于jQuery底部带缩略图的焦点图
  11. PIL保存二维numpy数组(2,2)为灰度图和RGB图
  12. 168.Excel Sheet Column Title
  13. sqlite3数据库报错:“打不开数据库文件”
  14. STM32实现Airplay音乐播放器
  15. arduino ps2摇杆程序_Arduino 双轴按键摇杆 PS2游戏摇杆 控制杆 JoyStick 电子积木
  16. Technorati 推出博客广告媒体
  17. react全家桶指的是哪些?
  18. 文件批量重命名(Excel+REN)
  19. D38 Java智能电话项目本————创建实体类
  20. EFR32 gecko 2生产烧录

热门文章

  1. 仙气满满的霍尊竟然这么皮?自爆体重已经突破……
  2. 汽车车灯产业链全景图
  3. php fseek和fsgets,20160724IOS_C
  4. BERT模型为什么这么强?
  5. Greenplum数据库查看表倾斜的方法总结
  6. 10个营销中常见的用户心理效应
  7. ARM9 SWI软件中断
  8. 怀旧服美服哪个服务器人最多,魔兽怀旧服:最新美服人口普查,增长6万,总玩家数破22万...
  9. 2015年个人收获-成果、经验分享(项目经理、集成资质、网站开发、服务器等)
  10. SpringBoot中使用redis事务