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)
通過數據的分析和可視化可得知:國內疫情逐漸穩定,確診人數多,治愈人數也多,每日增加人數少。國外疫情形勢不容樂觀,每日確診人數增長迅猛。
總結:這次作業大部分要求都做了,爬取國外是后面才加進去的為了美觀插入到了代碼中,導致變量名有些亂。散點圖由於湖南省確診人數與其他省差距實在太大,導致點都集中在一起。