爬取騰訊國內外疫情數據並對其分析


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) 

 

通過數據的分析和可視化可得知:國內疫情逐漸穩定,確診人數多,治愈人數也多,每日增加人數少。國外疫情形勢不容樂觀,每日確診人數增長迅猛。

總結:這次作業大部分要求都做了,爬取國外是后面才加進去的為了美觀插入到了代碼中,導致變量名有些亂。散點圖由於湖南省確診人數與其他省差距實在太大,導致點都集中在一起。

          

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM