一、國內疫情數據的爬取
1.1 獲取響應
# 導入requests庫
import requests
url = "https://voice.baidu.com/act/newpneumonia/newpneumonia"
response = requests.get(url)
# 查看響應的編碼
print("編碼:",response.encoding)
# 查看響應頭
print(response.headers)
# 查看響應地址
print("地址:",response.url)
# 查看響應狀態碼,200表示請求成功
print("狀態碼:",response.status_code)
# 查看正確響應的結果,並與網頁源代碼比較一下,是否相同
result = response.text
print(result)
1.2 使用xpath解析數據
# 導入xpath庫,如未安裝在cmd裏面輸入pip install xpath即可
from lxml import etree # 將數據轉化爲樹形態
# 生成HTML對象
html = etree.HTML(result)
result = html.xpath('//script[@type="application/json"]/text()')
1.2.1 分析xpath解析的數據
# 查看解析結果
print(result)
# 查看數據類型
print(type(result))
# 查看列表長度
print(len(result))
# 進一步提取列表中的數據
result = result[0]
1.2.2 再一次分析數據
# 查看上一步提取結果
print(result)
# 查看數據類型
print(type(result))
1.3 json轉化xpath數據類型
使用json.loads()方法可以將字符串轉換爲Python的基本數據類型
# 導入Json庫,此庫無需安裝
import json
result = json.loads(result)
# 查看結果
print(result)
# 查看數據類型
print(type(result))
# 獲取字典中所有的鍵
print(result.keys())
# 查看每一個鍵對應的數據
print(result["page"])
# 查看每一個鍵對應的數據
print(result["component"])
# 查看每一個鍵對應的數據
print(result["bundle"])
# 查看每一個鍵對應的數據
print(result["version"])
通過查看這些鍵,可以得出result[“component”]纔是我們需要的結果,但是探索還未結束,還要繼續
result = result["component"]
# 查看結果
print(result)
# 查看數據類型
print(type(result))
# 查看列表長度
print(len(result))
# 提取列表中的數據
result = result[0]
# 查看數據
print(result)
# 查看數據類型
print(type(result))
# 獲取所有的鍵值
print(result.keys())
從上面的結果中可以看到數據量特別的大,因此這裏只查看我們需要的目標數據
# 查看所有鍵值
# for i in result.keys():
# print(i)
# print(result[i])
# print("*"*20)
# 查看當前數據更新時間
result['mapLastUpdatedTime']
# 中國當前時間的數據省市數據
# result['caseList']
# 國外數據更新時間
result["foreignLastUpdatedTime"]
# 國外數據
# result['caseOutsideList']
# 全球數據
# result["globalList"]
查看國內當前數據
result = result['caseList']
for each in result:
print(each)
print("--"*30)
各項數據總結:
類型 | 說明 |
---|---|
confirmed | 累計確診人數 |
died | 死亡人數 |
crued | 治癒人數 |
relativeTime | 時間 |
confirmedRelative | 確診增量 |
diedRelative | 死亡增量 |
curedRelative | 治癒增量 |
curConfirm | 現有確診 |
curConfirmRelative | 現有確診增量 |
icuDisable | ID編號 |
area | 省/直轄市/特別行政區 |
subList | area的地級市 |
1.4 逐個獲取我們需要的數據,並保存至Excel中
# 導入模塊
import openpyxl
1.4.1 創建工作簿
wb = openpyxl.Workbook()
1.4.2 創建工作表
ws = wb.active
# 設置表的標題
ws.title = "國內疫情"
1.4.3 寫入數據至表中
# 寫入表頭
ws.append(["省份","累計確診","死亡","治癒"])
for each in result:
list_name = [each["area"],each["confirmed"],each["died"],each["crued"]]
# 如果爲空則填充0
for i in list_name:
if i == "":
i = "0"
ws.append(list_name)
1.4.4 數據保存
wb.save('./data1.xlsx')
1.5 代碼彙總
# 導入requests庫
import requests
url = "https://voice.baidu.com/act/newpneumonia/newpneumonia"
response = requests.get(url)
# 查看正確響應的結果,並與網頁源代碼比較一下,是否相同
result = response.text
# 導入xpath庫,如未安裝在cmd裏面輸入pip install xpath即可
from lxml import etree # 將數據轉化爲樹形態
# 生成HTML對象
html = etree.HTML(result)
result = html.xpath('//script[@type="application/json"]/text()')
result = result[0]
# 導入Json庫,此庫無需安裝
import json
result = json.loads(result)
result = result["component"]
# 獲取國內當前數據
result = result[0]['caseList']
# 導入模塊
import openpyxl
# 創建工作簿
wb = openpyxl.Workbook()
# 創建工作表
ws = wb.active
# 設置表的標題
ws.title = "國內疫情"
# 寫入表頭
ws.append(["省份","累計確診","死亡","治癒"])
# 寫入各行
for each in result:
list_name = [each["area"],each["confirmed"],each["died"],each["crued"]]
# 如果爲空則填充0
for i in list_name:
if i == "":
i = "0"
ws.append(list_name)
# 保存至excel中
wb.save('./data_china.xlsx')
二、國外疫情數據的爬取
根據國內的方法,只需要將result[‘caseList’] 改爲 result[“globalList”]即可
# 導入requests庫
import requests
url = "https://voice.baidu.com/act/newpneumonia/newpneumonia"
response = requests.get(url)
# 查看正確響應的結果,並與網頁源代碼比較一下,是否相同
result = response.text
# 導入xpath庫,如未安裝在cmd裏面輸入pip install xpath即可
from lxml import etree # 將數據轉化爲樹形態
# 生成HTML對象
html = etree.HTML(result)
result = html.xpath('//script[@type="application/json"]/text()')
result = result[0]
# 導入Json庫,此庫無需安裝
import json
result = json.loads(result)
result = result["component"]
# 獲取國外當前數據
result = result[0]
result = result["globalList"]
# 查看國外數據
# print(result)
# 可以發現結果爲一個列表且長度爲8
print(type(result),len(result))
# 通過遍歷並分析這個列表,發現這裏是以七大洲和鑽石公主號郵輪構成的這個列表
for i in result:
print(i)
print("-"*50)
以每個洲以及郵輪分別創建一個表,來存儲各個州的各個國家的數據
# 導入模塊
import openpyxl
# 創建工作簿
wb = openpyxl.Workbook()
for each in result:
title = each["area"] # 獲取各州名
ws = wb.create_sheet(title) # 根據名稱創建多個工作表
ws.append(["國家","累計確診","死亡","治癒"]) # 寫入表頭至新建的表
for country in each["subList"]: # 可以從原始數據中看到各個國家的數據在"subList"鍵中
list_name = [country["country"],country["confirmed"],country["died"],country["crued"]]
for i in list_name:
if i == "":
i = "0"
ws.append(list_name)
# 保存至excel中
wb.save('./data_global.xlsx')
2.1 代碼彙總
# 導入requests庫
import requests
url = "https://voice.baidu.com/act/newpneumonia/newpneumonia"
response = requests.get(url)
# 查看正確響應的結果,並與網頁源代碼比較一下,是否相同
result = response.text
# 導入xpath庫,如未安裝在cmd裏面輸入pip install xpath即可
from lxml import etree # 將數據轉化爲樹形態
# 生成HTML對象
html = etree.HTML(result)
result = html.xpath('//script[@type="application/json"]/text()')
result = result[0]
# 導入Json庫,此庫無需安裝
import json
result = json.loads(result)
result = result["component"]
# 獲取國外當前數據
result = result[0]
result = result["globalList"]
# 導入模塊
import openpyxl
# 創建工作簿
wb = openpyxl.Workbook()
for each in result:
title = each["area"] # 獲取各州名
ws = wb.create_sheet(title) # 根據名稱創建多個工作表
ws.append(["國家","累計確診","死亡","治癒"]) # 寫入表頭至新建的表
for country in each["subList"]: # 可以從原始數據中看到各個國家的數據在"subList"鍵中
list_name = [country["country"],country["confirmed"],country["died"],country["crued"]]
for i in list_name:
if i == "":
i = "0"
ws.append(list_name)
# 保存至excel中
wb.save('./data_global.xlsx')
三、結果