Python爬蟲實戰練習(疫情數據獲取)

一、國內疫情數據的爬取

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')      

三、結果

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章