Python实现疫情数据爬虫与可视化分析
本文详细介绍如何使用Python进行疫情数据爬取与可视化。通过requests获取腾讯接口数据,利用pandas清洗保存,最后使用pyecharts绘制死亡率、治愈率及各地区确诊分布图表,完整展示从数据获取到可视化展示的全流程。
本文涉及的核心知识点包括爬虫的基本工作流程、JSON数据格式处理、网络请求库requests的使用、数据处理与存储库pandas的应用,以及可视化展示库pyecharts的操作。
- 爬虫的基本流程通常包含几个关键步骤:首先确定目标数据源,接着构建并发送网络请求,随后获取服务器返回的数据,对数据进行解析提取,将有效数据保存至本地或数据库,最后对数据进行可视化展示以直观呈现结果。
- JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在爬虫开发中,大多数API接口返回的数据格式均为JSON,因此掌握JSON数据的解析与处理是爬虫开发的基础技能。
- 在Python爬虫开发中,requests库是发送HTTP网络请求最常用的第三方库。它允许用户轻松发送HTTP/1.1请求,无需手动添加查询字串或POST数据。通过简单的API调用,即可实现GET、POST等常见请求方式,是获取网页数据的首选工具。
- pandas是Python中用于数据处理和分析的强大库,特别擅长处理表格型数据。在爬虫项目中,pandas常用于数据的清洗、转换、聚合以及保存。例如,将爬取的JSON数据转换为DataFrame格式,并方便地导出为CSV或Excel文件,便于后续分析。
- pyecharts是一个基于Echarts的Python可视化库,支持多种图表类型如柱状图、折线图、饼图、地图等。它能够生成高质量的交互式图表,非常适合用于数据展示和分析结果的可视化,帮助用户更直观地理解数据背后的趋势和规律。
选择合适的开发环境对于提高开发效率至关重要。本文推荐的开发环境配置旨在提供一个稳定且功能丰富的编程平台,确保代码编写的顺畅以及数据分析的准确性。
Python 3.8是一个相对稳定且广泛使用的解释器版本。推荐使用Anaconda发行版,它预装了众多科学计算库,并集成Jupyter Notebook作为交互式编码环境。Jupyter Notebook支持代码、文本、公式和图表的混合编写,非常适合数据分析和原型开发。
PyCharm是一款专业的Python代码编辑器,由JetBrains开发。它提供了代码补全、调试、版本控制集成等功能,并支持按年份和月份划分版本,满足不同开发阶段的需求。对于大型项目或专业开发,PyCharm能显著提升编码效率和代码质量。
以下是实现疫情数据爬取与可视化的完整代码示例,涵盖了从模块导入、数据获取、解析保存到可视化展示的全过程。
在编写爬虫代码之前,首先需要导入所需的Python模块。这些模块包括用于网络请求的requests、处理JSON数据的json、格式化输出的pprint、数据处理与分析的pandas,以及用于可视化的pyecharts相关组件。
import requests # 发送网络请求模块
import json
import pprint # 格式化输出模块
import pandas as pd # 数据分析当中一个非常重要的模块
在开始爬取之前,必须对目标网站进行分析,确定数据获取的方式和接口。这包括识别目标URL、分析请求参数以及理解返回数据的结构,从而制定有效的爬取策略。
首先,需要明确今天要爬取的具体目标数据。在本例中,目标是获取最新的疫情统计数据,包括确诊病例、死亡人数、治愈人数等关键指标。
目标数据来源于腾讯新闻的疫情专题页面,其具体访问地址为:https://news.qq.com/zt2020/page/feiyan.htm#/。该页面提供了实时的疫情数据展示,是获取相关数据的重要来源。

通过浏览器开发者工具或网络抓包,可以找到实际返回数据的API接口URL。这个URL通常包含特定的参数,用于请求特定格式的数据,如JSON格式。找到正确的URL是成功获取数据的关键步骤。


使用requests库向找到的API URL发送GET请求。在发送请求时,可能需要设置特定的headers或处理SSL验证(如设置verify=False以跳过证书验证,适用于自签名证书或测试环境)。
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&_=1638361138568'
response = requests.get(url, verify=False)
接收服务器返回的响应后,提取响应体中的JSON数据。通常,响应对象包含一个json()方法,可以直接将响应内容解析为Python字典或列表结构,便于后续处理。
json_data = response.json()['data']
对获取的原始JSON数据进行解析和清洗。这包括从嵌套的JSON结构中提取所需字段,如省份名称、新增确诊、死亡人数、治愈人数、死亡率及治愈率等,并将这些数据整理为结构化的列表或字典。
json_data = json.loads(json_data)
china_data = json_data['areaTree'][0]['children'] # 列表
data_set = []
for i in china_data:
data_dict = {}
# 地区名称
data_dict['province'] = i['name']
# 新增确认
data_dict['nowConfirm'] = i['total']['nowConfirm']
# 死亡人数
data_dict['dead'] = i['total']['dead']
# 治愈人数
data_dict['heal'] = i['total']['heal']
# 死亡率
data_dict['deadRate'] = i['total']['deadRate']
# 治愈率
data_dict['healRate'] = i['total']['healRate']
data_set.append(data_dict)
将解析后的数据保存为本地文件,通常使用CSV格式。利用pandas库的DataFrame功能,可以将数据列表转换为表格,并调用to_csv方法保存为data.csv文件,便于后续读取和分析。
df = pd.DataFrame(data_set)
df.to_csv('data.csv')

数据可视化是将抽象数据转化为直观图表的过程。通过pyecharts库,可以创建多种类型的图表,如柱状图、折线图、饼图和地图,以展示疫情数据的分布、趋势和对比情况。
在可视化部分,首先需要导入pyecharts的相关模块,包括选项配置opts以及各类图表类如Bar(柱状图)、Line(折线图)、Pie(饼图)、Map(地图)和Grid(网格布局)。
from pyecharts import options as opts
from pyecharts.charts import Bar,Line,Pie,Map,Grid
读取之前保存的CSV数据文件,将其加载为pandas DataFrame对象。对数据进行排序、筛选和转换,为可视化做准备。例如,按确诊人数排序,提取前几名省份的数据进行展示。
df2 = df.sort_values(by=['nowConfirm'],ascending=False)[:9]
df2

使用折线图展示各地区的死亡率与治愈率情况。通过add_xaxis添加省份名称,add_yaxis分别添加死亡率与治愈率数据,并设置图表标题为“死亡率与治愈率”,最后渲染至Notebook显示。
line = (
Line()
.add_xaxis(list(df['province'].values))
.add_yaxis("治愈率", df['healRate'].values.tolist())
.add_yaxis("死亡率", df['deadRate'].values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title="死亡率与治愈率"),
)
)
line.render_notebook()

使用柱状图展示各地区确诊人数与死亡人数的对比情况。通过add_xaxis添加省份名称,add_yaxis分别添加死亡人数与治愈人数数据,并设置图表标题为“各地区确诊人数与死亡人数情况”,同时启用数据缩放功能以优化展示效果。
bar = (
Bar()
.add_xaxis(list(df['province'].values)[:6])
.add_yaxis("死亡", df['dead'].values.tolist()[:6])
.add_yaxis("治愈", df['heal'].values.tolist()[:6])
.set_global_opts(
title_opts=opts.TitleOpts(title="各地区确诊人数与死亡人数情况"),
datazoom_opts=[opts.DataZoomOpts()],
)
)
bar.render_notebook()

以上就是Python爬虫爬取疫情数据并可视化展示的详细内容,更多关于Python爬取数据 可视化展示的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













