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/ 文件夾下,內容以下
html
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」正則表達式