今天是全中國按下暫停鍵的第 25 天,在全中國按下暫停鍵的日子里,主人翁每天早上睜眼第一件事就是打開手機看著疫情實時數據的變化,看看每一條催淚的新聞。揪著的心卻在默默祈禱疫情趕快過去。 言歸正傳,對於一個熱衷技術且大有前途的青年來說,數據看久了是不是想到要展示一個技術大白的真正技術了呢?今天的文章主 ...
今天是全中國按下暫停鍵的第 25 天,在全中國按下暫停鍵的日子里,主人翁每天早上睜眼第一件事就是打開手機看著疫情實時數據的變化,看看每一條催淚的新聞。揪著的心卻在默默祈禱疫情趕快過去。
言歸正傳,對於一個熱衷技術且大有前途的青年來說,數據看久了是不是想到要展示一個技術大白的真正技術了呢?今天的文章主人翁就抱著學習的態度將騰訊每天推送的實時疫情數據爬取下來進行數據展示。
思路:
-
網頁分析
-
實時數據抓取
-
數據可視化展示
網頁分析:
在百度中搜索 https://news.qq.com/zt2020/page/feiyan.htm
即可獲得疫情實時追蹤展示信息:
在此網頁任意地方 右鍵單擊
---> 檢查或者審查元素
查看源代碼,或者打開瀏覽器開發者模式,然後直接安 F12 查看源代碼,再查看網路反饋的消息,如下圖所示:
消息響應具體信息如下:
由上可知數據為 JSON 類型的數據。
實時數據抓取
通過網頁分析後瞭解到疫情數據是 JSON 類型,因此爬取的主要原理是通過 Requests 獲取 Json 請求。然後再獲取到各省份的相關數據,數據抓取代碼如下:
import time, json, requests
# 騰訊疫情實時數據數據 URL
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d'%int(time.time()*1000)
# 載入 JSON 數據並解析
data = json.loads(requests.get(url=url).json()['data'])
# 列印數據
print(data)
print(data.keys())
輸出數據部分信息如下:
data:{
'lastUpdateTime': '2020-02-24 16:04:30',
'chinaTotal': {
'confirm': 77262,
'heal': 24839,
'dead': 2596,
'nowConfirm': 49827,
'suspect': 3434,
'nowSevere': 9915
},
'chinaAdd': {
'confirm': 416,
'heal': 1932,
'dead': 151,
'nowConfirm': -1667,
'suspect': -714,
'nowSevere': -1053
},
……
keys: dict_keys(['lastUpdateTime', 'chinaTotal', 'chinaAdd', 'isShowAdd', 'showAddSwitch', 'areaTree', 'chinaDayList', 'chinaDayAddList', 'dailyNewAddHistory', 'dailyHistory', 'wuhanDayList', 'articleList'])
至此疫情數據就獲取完畢,So yesy 的有木有,接下來需要統計疫情數據的 34 個省份信息,首先分析輸出的數據,經過分析發現省份數據的 Json 頭為 areaTree,詳細信息如下圖所示:
獲取省份詳細代碼如下:
import time, json, requests
# 騰訊疫情實時數據數據 URL
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d'%int(time.time()*1000)
# 載入 JSON 數據並解析
data = json.loads(requests.get(url=url).json()['data'])
# 列印數據
print(data)
print(data.keys())
# 統計省份信息(34個省份 湖北 廣東 河南 浙江 湖南 安徽....)
num = data['areaTree'][0]['children']
print(len(num))
# 遍歷所有數據後輸出,直到輸出結束
for item in num:
print(item['name'],end=" ")
else:
print("\n")
輸出信息如下:
{'lastUpdateTime': '2020-02-24 17:06:26', 'chinaTotal': {'confirm': 77262, 'heal': 24839, 'dead': 2596, 'nowConfirm': 49827, 'suspect': 3434, 'nowSevere': 9915}, 'chinaAdd': {'confirm': 416, 'heal': 1932, 'dead': 151, ……
dict_keys(['lastUpdateTime', 'chinaTotal', 'chinaAdd', 'isShowAdd', 'showAddSwitch', 'areaTree', 'chinaDayList', 'chinaDayAddList', 'dailyNewAddHistory', 'dailyHistory', 'wuhanDayList', 'articleList'])
34
湖北 廣東 河南 浙江 湖南 安徽 江西 山東 江蘇 重慶 四川 黑龍江 北京 上海 河北 福建 廣西 陝西 雲南 海南 貴州 天津 山西 遼寧 吉林 甘肅 新疆 內蒙古 香港 寧夏 臺灣 青海 澳門 西藏
34 個省份數據獲取完畢後接下來需要解析全國已確診的省份對應數據,詳細代碼如下:
import time, json, requests
# 騰訊疫情實時數據數據 URL
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d'%int(time.time()*1000)
# 載入 JSON 數據並解析
data = json.loads(requests.get(url=url).json()['data'])
# 列印數據輸出數據
print(data)
print(data.keys())
# 統計省份信息(34個省份 湖北 廣東 河南 浙江 湖南 安徽....)
num_area = data['areaTree'][0]['children']
print(len(num_area))
# 遍歷所有數據後輸出,直到輸出結束
for item in num_area:
print(item['name'],end=" ")
else:
print("\n")
# 解析所有確診數據
all_data = {}
for item in num_area:
# 輸出省市名稱
if item['name'] not in all_data:
all_data.update({item['name']:0})
#輸出省市對應的數據
for city_data in item['children']:
all_data[item['name']] +=int(city_data['total']['confirm'])
# 輸出結果
print(all_data)
結果輸出為:
{'lastUpdateTime': '2020-02-24 17:06:26', 'chinaTotal': {'confirm': 77262, 'heal': 24839, 'dead': 2596, 'nowConfirm': 49827, 'suspect': 3434, ……owSevere': 9915}
dict_keys(['lastUpdateTime', 'chinaTotal', 'chinaAdd', 'isShowAdd', 'showAddSwitch', 'areaTree', 'chinaDayList', 'chinaDayAddList', 'dailyNewAddHistory', 'dailyHistory', 'wuhanDayList', 'articleList'])
34
湖北 廣東 河南 浙江 湖南 安徽 江西 山東 江蘇 重慶 四川 黑龍江 北京 上海 河北 福建 廣西 陝西 雲南 海南 貴州 天津 山西 遼寧 吉林 甘肅 新疆 內蒙古 香港 寧夏 臺灣 青海 澳門 西藏
{'湖北': 64287, '廣東': 1345, '河南': 1271, '浙江': 1205, '湖南': 1016, '安徽': 989, '江西': 934, '山東': 755, '江蘇': 631, '重慶': 575, '四川': 527, '黑龍江': 480, '北京': 399, '上海': 335, '河北': 311, '福建': 293, '廣西': 251, '陝西': 245, '雲南': 174, '海南': 168, '貴州': 146, '天津': 135, '山西': 132, '遼寧': 121, '吉林': 93, '甘肅': 91, '新疆': 76, '內蒙古': 75, '香港': 74, '寧夏': 71, '臺灣': 28, '青海': 18, '澳門': 10, '西藏': 1}
接下來我們對比一下抓取的數據是否正確:實時數據為:
抓取的數據為:
'湖北': 64287,
'廣東': 1345,
'河南': 1271,
'浙江': 1205,
'湖南': 1016,
'安徽': 989,
'江西': 934,
'山東': 755,
'江蘇': 631,
'重慶': 575,
'四川': 527,
由此可見抓取的數據和實時的數據無差異。
數據可視化展示
接下來我們將對已經解析好的數據進行可視化展示,本文可視化知識點使用的是公眾號 100 天學習計劃的知識點 Matplotlib,詳情參考文章: 第91天:Python matplotlib introduction 和 第92天:Python Matplotlib 進階操作
數據展示思路和代碼如下:
# 使用 Matplotlib 繪製全國確診病例柱狀圖
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] #正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False #正常顯示負號
#獲取數據
names = all_data.keys()
nums = all_data.values()
print(names)
print(nums)
# 繪圖
plt.figure(figsize=[11,7])
plt.bar(names, nums, width=0.8, color='purple')
# 設置標題
plt.xlabel("地區", fontproperties='SimHei', size=15)
plt.ylabel("人數", fontproperties='SimHei', rotation=90, size=12)
plt.title("全國疫情確診圖", fontproperties='SimHei', size=16)
plt.xticks(list(names), fontproperties='SimHei', rotation=-60, size=10)
# 顯示數字
for a, b in zip(list(names), list(nums)):
plt.text(a, b, b, ha='center', va='bottom', size=6)
# 圖形展示
plt.show()
疫情數據可視化展示完畢!
總結
本文用到的思路及知識點總結如下:
數據爬取思路:網站分析 --> 獲取數據 --> 解析數據
數據可視化思路:Matplotlib 基本知識的運用 --> 分析數據-->畫圖--> 展示圖形
最後希望疫情早點結束,沒有一個冬天不可逾越,沒有一個春天不會到來,中國加油!武漢加油!