聊聊大家都在關心的問題,Python採集當前疫情形勢!

来源:https://www.cnblogs.com/7758520lzy/archive/2020/03/04/12412059.html
-Advertisement-
Play Games

今天是全中國按下暫停鍵的第 25 天,在全中國按下暫停鍵的日子里,主人翁每天早上睜眼第一件事就是打開手機看著疫情實時數據的變化,看看每一條催淚的新聞。揪著的心卻在默默祈禱疫情趕快過去。 言歸正傳,對於一個熱衷技術且大有前途的青年來說,數據看久了是不是想到要展示一個技術大白的真正技術了呢?今天的文章主 ...


今天是全中國按下暫停鍵的第 25 天,在全中國按下暫停鍵的日子里,主人翁每天早上睜眼第一件事就是打開手機看著疫情實時數據的變化,看看每一條催淚的新聞。揪著的心卻在默默祈禱疫情趕快過去。

言歸正傳,對於一個熱衷技術且大有前途的青年來說,數據看久了是不是想到要展示一個技術大白的真正技術了呢?今天的文章主人翁就抱著學習的態度將騰訊每天推送的實時疫情數據爬取下來進行數據展示。

思路:

 

  1. 網頁分析

  2. 實時數據抓取

  3. 數據可視化展示

網頁分析:

在百度中搜索 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 基本知識的運用 --> 分析數據-->畫圖--> 展示圖形

最後希望疫情早點結束,沒有一個冬天不可逾越,沒有一個春天不會到來,中國加油!武漢加油!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、面向對象技術簡介 類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。 方法:類中定義的函數。 類變數:類變數在整個實例化的對象中是公用的。類變數定義在類中且在函數體之外。類變數通常不作為實例變數使用。 數據成員:類變數或者實 ...
  • 基於SSM開發學生請假管理系統 開發環境: Windows操作系統開發工具: Eclipse+Jdk+Tomcat+MySql資料庫需求: 開發一個學生請假審批系統,在瀏覽器中打開運行,前端使用jsp以及jstl,後端使用Spring+SpringMVC+Mybatis。資料庫使用MySQL。所有使 ...
  • 基於JSP開發Java線上學習平臺系統開發環境: Windows操作系統開發工具:Myeclipse+Jdk+Tomcat7+MYSQL資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=121 ...
  • golang 自學系列(三)—— if,for,channel 一般情況下,if 語句跟大多數語言的 if 判斷語句一樣,根據一個 boolean 表達式結果來執行兩個分支邏輯。 但凡總是有例外,go 語言還有這種寫法: 寫法 1 的意思是在判斷邏輯前,可以加一個表達式,比如獲取 ID 賦值給 i, ...
  • JIT:Just In Time AOT:Ahead of Time 含義: 目前,程式主要有兩種運行方式:靜態編譯與動態解釋。 靜態編譯的程式在執行前全部被翻譯為機器碼,通常將這種類型稱為AOT (Ahead of time compiler)即 “提前編譯”;如C、C++。 判斷標準是:程式執行 ...
  • 原因: 在controller層請求處理完了返回時,沒有使用@RestController或@ResponseBody而返回了非json格式 解決: 1,類上註解@Controller改為@RestController 註意:如果同一個controller中有其他方法需要返回html頁面路徑,這個時 ...
  • Python批處理腳本只能處理較為簡單的順序執行的語句, 語句太多了,就有點亂...是時候升級一下了。 函數可以將多條語句分組封裝,實現面向過程的,簡單的模塊化管理。 方便將語句實行“網格”管控,不容易亂。 代碼編譯或運行中出bug不要緊,找該函數即可。 簡單的Python函數 簡單點,就是將多條語 ...
  • 一、葵花寶典: 學習新知識的【靈魂三問】 + what XXX是什麼? 遇到新名詞,先從字面意思下手,提取其中的關鍵詞,拆分解釋。 例如:變數,會變的量…… + why 為什麼要有它,有啥用? 一種事物的存在,即有其理由。 為什麼要有它,用它來做什麼? 編程語言是由人類創造,用來控制電腦運行操作的 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...