Python新冠肺炎疫情数据的爬取与可视化分析

阅读: 评论:0

Python 新冠肺炎疫情数据的爬取与可视化分析
前⾔
这两年,新冠肺炎肆虐⽽来,随着确诊⼈数的不断上升,全世界的⼈都陷⼊了恐慌中。我们经常能在⼿机、电视上看到各个地区疫情的情况,但那些数据⼤多数都是零碎的,我们不可能去记住每个数据,但我们可以⽤爬⾍爬取各个地区发出的新闻数据,再将这些数据进⾏整理分析。所以我们在疫情期间可以通过访问⼀个⽹站,就能知道各个地区的疫情情况。
数据来源
爬⾍设计⽅案
1. 爬⾍名称
新冠肺炎疫情数据的爬取与可视化分析
2. 爬取内容与数据特征分析
爬取的内容包括了全球新冠肺炎疫情数据、中国各省市新冠肺炎疫情数据和福建各市新冠肺炎疫情数据。
爬取的数据都由中⽂和数字组成,所有数字数据都是⼤于等于0,不会出现⼩于0的情况。
3. ⽅案概述
分析⽹站页⾯结构,到爬取数据的位置,根据不同的数据制定不同的爬取⽅法,将爬取的数据保存成csv ⽂件,然后再将csv ⽂件⾥的数据进⾏可视化处理。⽹站页⾯的结构特征分析
1. ⽹站页⾯结构分析
从下⾯的⽹站截图中可以看出,该⽹站的结构分为三个部分,⼀部分是左上的疫情总览,⼀部分是右边各个地区的疫情消息,还有⼀部分就是左下各个地区具体的疫情数据,⽽这部分数据就是我们要爬取的数据。
2. ⽹站html 页⾯结构分析
从下⾯的⽹站html 截图中可以看出,该⽹站由div 标签进⾏分割内容,总共分了两⼤块,左边和右边,我们需要的数据在左边。
进⼀步分析⽹站的html ,发现数据都在class=data-list 的div 标签⾥,在div 标签⾥的列表标签ul ,存放着中国每个省的疫情数据。
在li 标签下,还有⼀个div ,这个div ⾥的ul 列表存放的数据是每个省市的数据。
3. 标签查⽅法与遍历⽅法
通过上⾯⽹站html 页⾯的分析,可以画出标签树。
(1)地区名称所在标签的查⽅法
厦门鼓浪屿船票网上订票
各个省份的名称在class=list-pro-name 的div 标签⾥,⽽各省份的城市的名称在class=list-city-name 的div 标签⾥。因为这两个标签的class 属性不同,所以可以⽤BeautifulSoup 库的find()⽅法,利⽤标签属性值检索。
(2)地区疫情数据所在标签的查⽅法
从上⾯的标签树中可以看出,省疫情数据和市疫情数据分别在不同的li 标签下的div 标签⾥,第⼆个li 是第⼀个li 的⼦标签。在这两个标签之间没有可以唯⼀标识的熟悉,所以要查到这两个标签需要BeautifulSoup 库的CSS 选择器,通过标签的⽗⼦关系分别到两个li 标签。
爬⾍程序设计
1. 数据的爬取
(1)中国新冠疫情数据的爬取
# 获取中国每个省的疫情数据def getProvinceData(html):    total_data=[]    temporary=[]    new_diagnosis_data=[]    cumulative_diagnosis_data=[]    cured_data=[]    dead_data=[]
soup = BeautifulSoup(html,'html.parser')
>
# 到 class=data-list 的div标签
data = soup.find('div',{'class':'data-list'})
ul = data.find('ul')
div = ul.find_all('div',{'class':'list-pro-name'})
province_name_data=[]
for i in div:
# 获取省的名称
# 省名称在label标签⾥
province_name = i.find('label').string
province_name_data.append(province_name)
# ⽤CSS选择器获取第⼀层的数据(每个省的数据)
diagnosis = soup.select('div.data-list > ul > li > div.list-city-data')    for i in diagnosis:
temporary.append(i.string)
total = [temporary[i:i+4] for i in range(0,len(temporary),4)]
for i in range(len(total)):
# 获取新增确诊⼈数
new_diagnosis_data.append(total[i][0])
去一趟迪拜要多少钱
# 获取累计确诊⼈数
cumulative_diagnosis_data.append(total[i][1])
# 获取治愈⼈数
cured_data.append(total[i][2])
# 获取死亡⼈数
dead_data.append(total[i][3])
total_data.append(province_name_data)
total_data.append(new_diagnosis_data)
total_data.append(cumulative_diagnosis_data)
紫龙湾温泉门票价格total_data.append(cured_data)
total_data.append(dead_data)
常家庄园主人简介return total_data
(2)福建省新冠疫情数据的爬取
# 获取福建省每个市的疫情数据
def getCitiData(html):
citi_name_data=[]
new_diagnosis_data=[]
cumulative_diagnosis_data=[]
cured_data=[]
dead_data=[]
total_data=[]
soup = BeautifulSoup(html,'html.parser')
data = soup.find('div',{'class':'data-list'})
# 到有唯⼀标识的属性的input标签
input1 = data.find('input',{'id':'_209'})
# 到input标签的的⽗标签
div = input1.parent
# 到所有的li
li = div.find_all('li')
# 遍历li组成的列表
for i in range(1,len(li)):
# 获取市名称
citi_name = li[i].find('div',{'class':'list-city-name'})
citi_name_data.append(citi_name.string+'市')
div = li[i].find_all('div',{'class':'list-city-data'})
# 获取新增确诊⼈数
new_diagnosis = div[0].string
new_diagnosis_data.append(new_diagnosis)
# 获取累计确诊⼈数
cumulative_diagnosis = div[1].string
cumulative_diagnosis_data.append(cumulative_diagnosis)
# 获取治愈⼈数
cured = div[2].string
cured_data.append(cured)
# 获取死亡⼈数
dead = div[3].string
dead_data.append(dead)
total_data.append(citi_name_data)
total_data.append(new_diagnosis_data)
total_data.append(cumulative_diagnosis_data)
total_data.append(cured_data)
total_data.append(dead_data)
return total_data
(3)国外新冠疫情数据的爬取九龙瀑布风景区门票多少钱
# 获取全球每个国家的疫情数据
def getWorldData(html):上海22个小众景点
country_name_data=[]
new_diagnosis_data=[]
cumulative_diagnosis_data=[]
cured_data=[]
dead_data=[]
total_data=[]
soup = BeautifulSoup(html,'html.parser')
data = soup.find('div',{'class':'data-list'})
# 因为有两层li,我们需要的是第⼆层的li,所以可以通过CSS选择器来获取第⼆层的li    data_list = data.select('ul > li > div > div > ul > li')
for i in range(12,len(data_list)-1):
div = data_list[i].find_all('div')
# 获取国家名称
country_name = div[0].string
country_name_data.append(country_name)
# 获取新增确诊⼈数
new_diagnosis = div[1].string
new_diagnosis_data.append(new_diagnosis)
# 获取累计确诊⼈数
cumulative_diagnosis = div[2].string
cumulative_diagnosis_data.append(cumulative_diagnosis)
# 获取治愈⼈数
cured = div[3].string
cured_data.append(cured)
# 获取死亡⼈数
dead = div[4].string
dead_data.append(dead)
total_data.append(country_name_data)
total_data.append(new_diagnosis_data)
total_data.append(cumulative_diagnosis_data)
total_data.append(cured_data)
total_data.append(dead_data)
return total_data
(4)保存数据
疫情数据爬取完后,通过Pandask库的to_csv()⽅法,将爬取后的数据保存为csv⽂件。保存后的部分数据:
2. 数据清洗与处理
(1)因为全球疫情的数据量较⼤,所以我们可以通过pandas库来查看数据是否有异常、缺失、重复
import pandas as pd
#导⼊数据
df_world = pd.read_csv("各国家的新冠肺炎疫情数据.csv")
# 查看数据的简要信息
df_world.describe()
(2)通过查看数据的简要信息,数据正常,数据的最⼩值也不是负数
(3)通过pandas库的isnull()⽅法查看是否有空值
# 查看是否有空值,有空值返回True,没有空值返回False
df_world.isnull().value_counts()
(4)通过pandas库的duplicated()⽅法查看是否有重复⾏
# 查看是否有重复⾏,有重复⾏返回True,没有重复⾏返回False
df_world.duplicated()
(5)为了之后能更好的分析数据,需要对数据进⾏排序,后⾯再排序也可以
#根据累计确诊⼈数对数据进⾏降序排序
df = df_world.sort_values(by='累计确诊',ascending=False)
(6)保存处理后的数据
#保存处理后的数据
import pandas as pd
df = df.set_index('名称')
<_csv("各国家的新冠肺炎疫情数据.csv",encoding='utf-8')
df_world = pd.read_csv("各国家的新冠肺炎疫情数据.csv")
df_world.head()
3. 数据可视化分析
(1)中国新冠肺炎疫情地图
# ⽤pyecharts库画中国新冠疫情地图
from pyecharts import options as opts
from pyecharts.charts import Map
import pandas as pd
# ⾃定义分段图例
pieces=[
{"max": 70000, "min": 3000, "label": ">3000", "color": "#B40404"},
{"max": 3000, "min": 1000, "label": "1000-3000", "color": "#DF0101"},
{"max": 1000, "min": 100, "label": "100-1000", "color": "#F78181"},
{"max": 100, "min": 10, "label": "10-100", "color": "#F5A9A9"},
{"max": 10, "min": 0, "label": "<10", "color": "#FFFFCC"},
]
name = []
values = []
# 导⼊数据
df = pd.ad_csv("各省的新冠肺炎疫情数据.csv"))
# 处理数据,将数据处理成Map所要求的数据
for i in range(df.shape[0]):  # shape[0]:⾏数,shape[1]:列数
name.append(df.at[i,'名称'])
values.append(str(df.at[i,'累计确诊']))
total = [[name[i],values[i]] for i in range(len(name))]
# 创建地图(Map)
china_map = (Map())
# 设置中国地图
china_map.add("确诊⼈数",total ,maptype="china",is_map_symbol_show=False)
china_map.set_global_opts(
# 设置地图标题
title_opts=opts.TitleOpts(title="中国各省、直辖市、⾃治区、特别⾏政区新冠肺炎确诊⼈数"),    # 设置⾃定义图例
visualmap_opts=opts.VisualMapOpts(max_=70000,is_piecewise=True,pieces=pieces),
legend_opts=opts.LegendOpts(is_show=False)
)
# 直接在notebook显⽰地图,默认是保存为html⽂件
der_notebook()
(2)中国确诊⼈数前15地区的治愈率与死亡率的折线图
import pandas as pd
import matplotlib.pyplot as plt
# 创建画布
fig=plt.figure(figsize=(10,8))
ax=fig.add_subplot(1,1,1)
#中⽂字体
# 导⼊数据
df_china = pd.read_csv("各省的新冠肺炎疫情数据.csv")
df_china['治愈率'] = df_china['治愈']/df_china['累计确诊']
df_china['死亡率'] = df_china['死亡']/df_china['累计确诊']
plt.plot(df_china.iloc[0:16,0],df_china.iloc[0:16,5],label="治愈率")
plt.plot(df_china.iloc[0:16,0],df_china.iloc[0:16,6],label="死亡率")
# y轴刻度标签
ax.set_yticks([0.05,0.2,0.4,0.6,0.8,1.0])
ax.set_yticklabels(["5 %","20 %","40 %","60 %","80 %","100 %"],fontsize=12)
# 图例
plt.legend(loc='center right',fontsize=12)
# 标题
plt.title("中国确诊⼈数前15地区的治愈率与死亡率")
# ⽹格
plt.show()
(3)中国确诊⼈数前15地区的新增确诊⼈数的折线图
import pandas as pd
import matplotlib.pyplot as plt
# 创建画布
fig=plt.figure(figsize=(10,8))
#中⽂字体
#导⼊数据
df_china = pd.read_csv("各省的新冠肺炎疫情数据.csv")
plt.plot(df_china.iloc[0:15,0],df_china.iloc[0:15,1],label="新增确诊")
# 图例
plt.legend(fontsize=12)
# 标题
plt.title("中国确诊⼈数前15地区的新增确诊⼈数")
# y轴标签
plt.ylabel('⼈数')
# ⽹格
plt.show()

本文发布于:2023-07-11 23:24:41,感谢您对本站的认可!

本文链接:http://www.035400.com/whly/3/524032.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   疫情   新冠   肺炎   标签   爬取   地区   获取
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2024-2030 Comsenz Inc.Powered by © 文化旅游网 滇ICP备2022007236号-403 联系QQ:1103060800网站地图