如何利用Python製作新型冠狀病毒省份(直轄市)實時疫情圖?
一.數據採集
先找到數據,對數據進行數據採集
數據來源:新浪疫情實時監測
URL: https://news.sina.cn/zt_d/yiqing0121
數據採集:
1.訪問https://news.sina.cn/zt_d/yiqing0121
2.打開Chrome開發者工具,點開network,刷新頁面,點擊各個請求,找到獲取取json的請求。
例如:附圖
https://interface.sina.cn/news/wap/fymap2020_data.d.json?1581410367084&&callback=sinajp_15814103671094932140955446096
返回的數據類型:
Headers:
Genneral
Request URL: https://interface.sina.cn/news/wap/fymap2020_data.d.json?1581410367084&&callback=sinajp_15814103671094932140955446096
Request Method: GET
Status Code: 200
Remote Address: 39.156.6.163:443
Referrer Policy: unsafe-url
Response Headers
content-type: text/html
返回的數據顯示:
City中,cureNum是治癒數,deathNum是死亡人數。value是確診數
數據處理:
用到以下幾個模塊
1.requests模塊 (用於網頁訪問)
2.re模塊 (用於正則表達式,處理數據時需要)
3.json模塊,讀取數據
4.圖表地圖模塊:pyecharts
數據包:echarts-china-provinces-pypkg
數據包:echarts-china-cities-pypkg
(用pip安裝requests,pyecharts以及兩個數據包),例如:pip install pyecharts
三.數據處理代碼:
說明:響應返回數據包含在一個js變量中,需要用正則處理下,然後用python自帶的json.loads方法轉爲dict。
import requests
json_str = re.search("\(+([^)]*)\)+",result.text).group(1)
html =f"{json_str}" |
生成地圖代碼:
For循環遍歷json數據,把省名和確診數存在data數據裏傳給map對象。
data=[] value_hb="" rdate=time.strftime('%Y-%m-%d',time.localtime(time.time())) rtime=time.strftime('%Y%m%d%H%M%S',time.localtime(time.time())) #for p in table['data']['list']: for province in json_data['data']['list']: #print (province) #data.append((province['name'], province['value'])) if province['name']=="湖北": name=province['name'] value_hb=province['value'] deathNum=province['deathNum'] cureNum=province['cureNum'] print ("當前日期:%s,湖北省實時疫情監測,確診:%s,死亡:%s,治癒:%s"%(rdate,value_hb,deathNum,cureNum)) #data.append((province['name'], province['value'])) for city in province['city']: cityname=city['mapName'] conNum1="確診:%s"%city['conNum'] deathNum1="死亡:%s"%city['deathNum'] cureNum1="治癒:%s"%city['cureNum'] message=conNum1+deathNum1+cureNum1 print (cityname,conNum1,deathNum1,cureNum1) data.append((cityname,city['conNum'])) map_p = Map() map_p.set_global_opts(title_opts=opts.TitleOpts(title="2019_nCoV 湖北省疫情圖"),visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces = [ {"min": 1000 , "label": '>1000',"color": "#893448"}, #這裏不指定 max,表示max爲無限大 {"min": 500, "max": 999, "label": '500-1000',"color": "#ff585e"}, {"min": 101, "max": 499, "label": '101-499',"color": "#fb8146"}, {"min": 10, "max": 99, "label": '10-100',"color": "#ffb248"}, {"min": 0, "max": 9, "label": '0-9',"color" : "#fff2d1" }])) map_p.add("當前日期:%s,湖北省實時疫情監測,確診:%s,死亡:%s,治癒:%s"%(rdate,value_hb,deathNum,cureNum), data, maptype="湖北") map_p.render("2019_ncov_hubei%s.html"%rtime) # 生成html文件 |
生成地圖如下:
max=1000,是指渲染指標,達到1000,就顏色越深。