1.目标是爬取腾讯国内外疫情数据
2.对爬取的数据进行数据清洗
3.清洗后数据的分析和可视化
实现思路:1.到所要爬取的网页使用f12查看源代码,查找所要爬取的数据的路据
2.使用get或post进行数据的爬取
3.提取有用的数据
4.使用pandas库将数据转换为二维表
5.使用pandas库进行数据清洗和回归方程的绘制
6.使用matplotlib库进行数据可视化
技术难点:数据在网页中的查找和爬取,爬取之后对有效数据的提取
打开所要爬取的网页:https://news.qq.com/zt2020/page/feiyan.htmfrom=timeline&isappinstalled=0#/global
使用f12打开工具找到真正的url,通过f12 Network可查找到
这个文件,文件打开是
同理,这是外国的文件
打开是这样的
里面正是所需要的数据
通过Console查找到此文件对应的路径可看到
国外的是
可以看到我国的疫情数据在areaTree标签下的0标签下的子标签里,外国数据在countryAddConfirmRankList标签下所以使用以下代码:
#导入相关库
import json
import requests
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
#爬取的网页地址
url="https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5"
url2="https://view.inews.qq.com/g2/getOnsInfo?name=disease_foreign"
#伪装请求头
headers ={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
#获取网页数据
r=requests.get(url,timeout=30,headers=headers)
req=requests.get(url2,timeout=30,headers=headers)
#将数据json化去掉/,方便操作
data = json.loads(r.text)
data = json.loads(data['data'])
data3 = json.loads(req.text)
data3 = json.loads(data3['data'])
print(data)
print(data3)
输出结果国内
国外
接下来提取所需要的数据,用到以下代码:
#从爬取的信息中提取所需信息
china=data['areaTree'][0]['children']
#爬取各大国家疫情情况
country=data3['countryAddConfirmRankList']
#print(china)
chinaTotals="确诊人数:"+str(data['chinaTotal']['confirm'])+\
"疑似人数:"+str(data['chinaTotal']['suspect'])+\
"死亡人数:"+str(data['chinaTotal']['dead'])+\
"治愈人数:"+str(data['chinaTotal']['heal'])+\
"更新日期:"+data['lastUpdateTime']
print(chinaTotals)
#获取中国各省名称,确诊人数,疑似人数,死亡人数,治愈人数
Total=[]
for i in range(len(china)):
Total.append([china[i]['name'],china[i]['total']['confirm'],
china[i]['total']['suspect'],china[i]['total']['dead'],
china[i]['total']['heal']])
#print(Total)
#获取各国新增加确诊人数
Country=[]
for i in range(len(country)):
Country.append([country[i]['nation'],country[i]['addConfirm']])
print(Country)
输出结果如下
下一步将数据转化为二维表然后进行数据清洗代码如下:
#将数据转换为二维表方便数据清洗和进一步的数据可视化
data1=pd.DataFrame(Total,index=range(1,35),columns=['省份','确诊人数','疑似人数','死亡人数','治愈人数'])
data4=pd.DataFrame(Country,index=range(1,11),columns=['国家','新增确诊人数'])
#print(data1)查看输出二维表是否出错
#数据清洗
#查找是否有缺失值
data1.isnull()
data4.isnull()
#只显示存在缺失的行列
data1[data1.isnull().values==True]
data4[data4.isnull().values==True]
#查找重复值
data1.duplicated()
data4.duplicated()
#删除重复值
data2=data1.drop_duplicates()
data5=data4.drop_duplicates()
#统计空值
data2.isna()
data5.isna()
print(data2)
print(data5)
输出结果
下一步进行数据可视化如下
#进行数据可视化
#正常显示中文
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus']=False
#创建画布
plt.figure(figsize=(10,10))#设置画布大小
#绘制子图1
axes1=plt.subplot(2,2,1)
X=data2.loc[:,'省份']
Y=data2.loc[:,'确诊人数']
#绘制柱状图
plt.bar(X,Y)
plt.title('我国各省至今确诊人数')
plt.xlabel('省份')
plt.ylabel('确诊人数')
#绘制子图2
axes2=plt.subplot(2,2,2)
#绘制确诊人数,疑似人数,死亡人数,治愈人数的饼图
a=[data['chinaTotal']['confirm'],data['chinaTotal']['suspect'],
data['chinaTotal']['dead'],data['chinaTotal']['heal']]
plt.pie(a,labels=['确诊人数','疑似人数','死亡人数','治愈人数'])
#绘制子图3
axes3=plt.subplot(2,1,2)
f=data5.loc[:,'国家']
g=data5.loc[:,'新增确诊人数']
plt.bar(f,g)
plt.title("国外新增确诊人数")
plt.show()
输出结果
接下来绘制散点图和回归方程代码如下:
#绘制散点图建立回归方程
X=data2.loc[:,'确诊人数']
Y=data2.loc[:,'治愈人数']
#计算相关性
X.corr(Y)
def func(params,x):
k,b=params
return k*x+b
#设误差函数
def error(params,x,y):
return func(params,x)-y
#主程序,输出最后的结果
def main():
plt.figure()
p0=[1,1]
Para=leastsq(error,p0,args=(X,Y))
k,b=Para[0]
print("k={:.2f},b={:.2f}".format(k,b))
plt.scatter(X,Y,color="green",label="疫情数据",linewidth=2)
#画拟合曲线
x=np.linspace(1,70000,1000)
y=k*x+b
plt.plot(x,y,color="red",label="拟合曲线",linewidth=2)
plt.legend()#绘制图例
plt.grid()
plt.show()
main()
#保存数据
dataframe_file.to_csv("疫情数据.csv", index=False)
输出结果
所有代码汇总如下:#导入相关库
import json
import requests
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
url="https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5"
url2="https://view.inews.qq.com/g2/getOnsInfo?name=disease_foreign"
#伪装请求头
headers ={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
#获取网页数据
r=requests.get(url,timeout=30,headers=headers)
req=requests.get(url2,timeout=30,headers=headers)
#将数据json化去掉/,方便操作
data = json.loads(r.text)
data = json.loads(data['data'])
data3 = json.loads(req.text)
data3 = json.loads(data3['data'])
#print(data)查看爬取数据
#从爬取的信息中提取所需信息
china=data['areaTree'][0]['children']
#爬取各大国家疫情情况
country=data3['countryAddConfirmRankList']
#print(china)
chinaTotals="确诊人数:"+str(data['chinaTotal']['confirm'])+\
"疑似人数:"+str(data['chinaTotal']['suspect'])+\
"死亡人数:"+str(data['chinaTotal']['dead'])+\
"治愈人数:"+str(data['chinaTotal']['heal'])+\
"更新日期:"+data['lastUpdateTime']
print(chinaTotals)
#获取中国各省名称,确诊人数,疑似人数,死亡人数,治愈人数
#建立空列表保存数据
Total=[]
for i in range(len(china)):
Total.append([china[i]['name'],china[i]['total']['confirm'],
china[i]['total']['suspect'],china[i]['total']['dead'],
china[i]['total']['heal']])
#print(Total)
#获取各国新增加确诊人数
#建立空列表保存数据
Country=[]
for i in range(len(country)):
Country.append([country[i]['nation'],country[i]['addConfirm']])
#print(Country)
#将数据转换为二维表方便数据清洗和进一步的数据可视化
data1=pd.DataFrame(Total,index=range(1,35),columns=['省份','确诊人数','疑似人数','死亡人数','治愈人数'])
data4=pd.DataFrame(Country,index=range(1,11),columns=['国家','新增确诊人数'])
#print(data1)查看输出二维表是否出错
#数据清洗
#查找是否有缺失值
data1.isnull()
data4.isnull()
#只显示存在缺失的行列
data1[data1.isnull().values==True]
data4[data4.isnull().values==True]
#查找重复值
data1.duplicated()
data4.duplicated()
#删除重复值
data2=data1.drop_duplicates()
data5=data4.drop_duplicates()
#统计空值
data2.isna()
data5.isna()
print(data2)
print(data5)
#进行数据可视化
#正常显示中文
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
#正常显示负号
plt.rcParams['axes.unicode_minus']=False
#创建画布
plt.figure(figsize=(10,10))#设置画布大小
#绘制子图1
axes1=plt.subplot(2,2,1)
X=data2.loc[:,'省份']
Y=data2.loc[:,'确诊人数']
#绘制柱状图
plt.bar(X,Y)
#标题
plt.title('我国各省至今确诊人数')
#x轴名称
plt.xlabel('省份')
#y轴名称
plt.ylabel('确诊人数')
#绘制子图2
axes2=plt.subplot(2,2,2)
#绘制确诊人数,疑似人数,死亡人数,治愈人数的饼图
a=[data['chinaTotal']['confirm'],data['chinaTotal']['suspect'],
data['chinaTotal']['dead'],data['chinaTotal']['heal']]
#绘制饼图
plt.pie(a,labels=['确诊人数','疑似人数','死亡人数','治愈人数'])
#绘制子图3
axes3=plt.subplot(2,1,2)
f=data5.loc[:,'国家']
g=data5.loc[:,'新增确诊人数']
#绘制柱状图
plt.bar(f,g)
plt.title("国外新增确诊人数")
plt.show()
#绘制散点图建立回归方程
X=data2.loc[:,'确诊人数']
Y=data2.loc[:,'治愈人数']
X.corr(Y)
def func(params,x):
k,b=params
return k*x+b
#设误差函数
def error(params,x,y):
return func(params,x)-y
#主程序,输出最后的结果
def main():
plt.figure()
p0=[1,1]
Para=leastsq(error,p0,args=(X,Y))
k,b=Para[0]
print("k={:.2f},b={:.2f}".format(k,b))
plt.scatter(X,Y,color="green",label="疫情数据",linewidth=2)
#画拟合曲线
x=np.linspace(1,70000,1000)
y=k*x+b
plt.plot(x,y,color="red",label="拟合曲线",linewidth=2)
plt.legend()#绘制图例
plt.grid()
plt.show()
main()
#保存数据
dataframe_file.to_csv("疫情数据.csv", index=False)
通过数据的分析和可视化可得知:国内疫情逐渐稳定,确诊人数多,治愈人数也多,每日增加人数少。国外疫情形势不容乐观,每日确诊人数增长迅猛。
总结:这次作业大部分要求都做了,爬取国外是后面才加进去的为了美观插入到了代码中,导致变量名有些乱。散点图由于湖南省确诊人数与其他省差距实在太大,导致点都集中在一起。
来源:oschina
链接:https://my.oschina.net/u/4359728/blog/3305132