># 到 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()