python爬蟲:新冠疫情累計確診數據爬取及數據可視化


 

一、數據爬取與整理

1.1 數據來源:丁香園網站

1.2 爬取思路:

  1. 使用requests包發送get請求,獲取響應的html頁面(返回值類型為str)
  2. 掃描字符串使用正則表達式匹配出描述國內數據的html語句
  3. 去除多余字符並將匹配后結果整理成json文件

1.3 代碼展示及文件說明:

import json
import re
import requests
import datetime

today = datetime.date.today().strftime('%Y%m%d')

def crawl_dxy_data():
    """爬取丁香園實時統計數據,保存在data目錄下,以當前日期作為文件名,文件格式為json格式
    """
    response = requests.get('https://ncov.dxy.cn/ncovh5/view/pneumonia')  # 發送get請求
    print(response.status_code)  # 打印狀態碼

    try:
        url_text = response.content.decode()  # 獲取響應的html頁面
     # re.search()用於掃描字符串以查找正則表達式模式產生匹配項的第一個位置,然后返回相應的match對象
     # 在字符串a中,包含換行符\n,這種情況下:如果不適用re.S參數,則只在每一行內進行匹配,如果一行沒有,就換下一行重新開始匹配
        url_content = re.search(r'window.getAreaStat = (.*?)}]}catch',   
                                url_text, re.S)                         
        texts = url_content.group()  # 獲取匹配正則表達式的整體結果
        content = texts.replace('window.getAreaStat = ', '').replace('}catch', '')  # 去除多余字符
        json_data = json.loads(content)
        with open('data/' + today + '.json', 'w', encoding='UTF-8') as f:
            json.dump(json_data, f, ensure_ascii=False)
    except:
        print('<Response [%s]>' % response.status_code)

crawl_dxy_data()

說明:存儲整理后數據的json文件保存在 ./data/ 文件夾下,內容如下
在這里插入圖片描述

二、數據可視化

2.1 可視化工具:

使用了百度的pyecharts包,相關API接口參考:pyecharts接口手冊

2.2 可視化代碼展示

import json
import datetime

from pyecharts.charts import Map
from pyecharts import options as opts   # pyecharts接口手冊:https://pyecharts.org/#/zh-cn/chart_api


# 讀取原始文件
today = datetime.date.today().strftime('%Y%m%d')
datefile = 'data/' + today + '.json'
with open(datefile, 'r', encoding='UTF-8') as f:
    json_array = json.loads(f.read())

# 分析全國實時確診數據: 'confirmedCount'字段
china_data = []
for province in json_array:
    china_data.append((province['provinceShortName'], province['confirmedCount']))
china_data = sorted(china_data, key=lambda x: x[1], reverse=True)   # reverse=True,表示降序

print(china_data)
# 全國疫情地圖
# 定義每個字段的范圍,以及每個字段的樣式
pieces = [
    {'min': 10000, 'color': '#540d0d'},
    {'max': 9999, 'min': 1000, 'color': '#9c1414'},
    {'max': 999, 'min': 500, 'color': '#d92727'},
    {'max': 499, 'min': 100, 'color': '#ed3232'},
    {'max': 99, 'min': 10, 'color': '#f27777'},
    {'max': 9, 'min': 1, 'color': '#f7adad'},
    {'max': 0, 'color': '#f7e4e4'},
]
labels = [data[0] for data in china_data]
counts = [data[1] for data in china_data]
m = Map()
m.add('累計確診', [list(z) for z in zip(labels, counts)], 'china')

# 系列配置項,可配置圖元樣式、文字樣式、標簽樣式、電線樣式等
m.set_series_opts(label_opts=opts.LabelOpts(font_size=12), is_show=False)
# 全局配置項,可配置標題、動畫、坐標軸、圖例等
# is_piecewise參數表示是否分段,is_show參數表示是否顯示視覺映射配置
m.set_global_opts(title_opts=opts.TitleOpts(title='全國實時確診數據', subtitle='數據來源:丁香園網站'),
                  legend_opts=opts.LegendOpts(is_show=False),
                  visualmap_opts=opts.VisualMapOpts(pieces=pieces, is_piecewise=True, is_show=True))   
# render()會生成本地html文件
filepath = './' + '新冠肺炎全國實時累計確診數據' + today + '.html'
m.render(path=filepath)

說明:最終展示結果寫入為html文件,保存在當前路徑下,文件名為“新冠肺炎全國實時累計確診數據.html”

2.3 可視化結果展示

在這里插入圖片描述


免責聲明!

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



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