摘要:
如何使用Python實時監(jiān)控疫情的發(fā)展動向嗎?小白們快來學(xué)習(xí)吧!
2020年注定是不平凡的一年,從2019年12月開始的新型冠狀病毒肺炎疫情席卷湖北省,并且有向全國逐步蔓延的趨勢。但是經(jīng)全國之力,萬眾一心,相信在不久的將來疫情就會被有效控制,直至將疫情消滅。
最近一周每天早上起來第一件事,就是打開新聞軟件看疫情相關(guān)的新聞。了解下自己和親友所在城市的確診人數(shù),但純數(shù)字還是缺乏一個直觀的概念。那我們來做一個吧。
至于數(shù)據(jù),從各大網(wǎng)站的實時疫情頁面就可以拿到。以某網(wǎng)站為例,用requests拿到html后,發(fā)現(xiàn)并沒有數(shù)據(jù)。不要慌,那證明是個javascript渲染的頁面,即使是javascript也是需要從后臺取數(shù)據(jù)的。打開Chrome開發(fā)者工具,點開network,刷新頁面,點擊各個請求,肯定有一個是取json的。
注意這里的返回數(shù)據(jù)是包含在一個js變量的,用正則處理下就好,然后用python自帶的json.loads方法就可以轉(zhuǎn)為dict了
result = requests.get( 'https://interface.sina.cn/news/wap/fymap2020_data.d.json?1580097300739&&callback=sinajp_1580097300873005379567841634181') json_str = re.search("\(+([^)]*)\)+", result.text).group(1) html = f"{json_str}" table = json.loads(f"{html}")
數(shù)據(jù)格式很簡單,省數(shù)據(jù)和下屬城市的數(shù)據(jù)
{ 'city': [ { 'conNum': '4', 'cureNum': '0', 'deathNum': '0', 'name': '烏魯木齊', 'susNum': '0'}, { 'conNum': '1', 'cureNum': '0', 'deathNum': '0', 'name': '伊犁州', 'susNum': '0'}], 'cureNum': '0', 'deathNum': '0', 'name': '新疆', 'susNum': '0', 'value': '5'}
英語好的同學(xué)可以直接猜到cureNum是治愈數(shù),deathNum是死亡人數(shù)。value應(yīng)該是確診數(shù),其它字段可以根據(jù)原網(wǎng)站表格確定
最直觀的圖表當(dāng)然是地圖了。國內(nèi)大廠出的echarts自然會對國內(nèi)地圖有最好的支持。用pip安裝pyecharts, 以及兩個數(shù)據(jù)包echarts-china-provinces-pypkg
echarts-china-cities-pypkg 即可
遍歷下json數(shù)據(jù),把省名和確診數(shù)存在data數(shù)據(jù)里傳給map對象就好
for province in table['data']['list']: pp.pprint(province) data.append((province['name'], province['value'])) for city in province['city']: pp.pprint(city)map_p = Map()map_p.set_global_opts(title_opts=opts.TitleOpts(title="實時疫情圖"), visualmap_opts=opts.VisualMapOpts(max_=100))map_p.add("確診", data, maptype="china")map_p.render("ncov.html") # 生成html文件
代碼很簡單,注意max是決定渲染顏色的。效果圖如下
達(dá)到100確診的省份一目了然。感興趣的同學(xué)還可以制作市級別或者世界地圖。
下面和大家分享如何開發(fā)一個簡易程序,實時監(jiān)控疫情狀況,并定時發(fā)送微信給自己或自己的好友。
首先我們要實現(xiàn)這么一個簡易程序,首先要將任務(wù)拆解為兩個個部分:
獲取疫情實時信息
將信息定時發(fā)送至微信好友
我們在獲取疫情實時信息的時候,采用requests庫,使用爬蟲抓取疫情實時信息的相關(guān)接口,然后將我們想要了解的信息解析出來,并生成要發(fā)送的信息。之后我們通過itchat庫實現(xiàn)微信的登錄與微信信息發(fā)送,將上一步所獲取的信息發(fā)送給好友,如果要設(shè)置為定時發(fā)送(比如每隔1小時發(fā)送一次信息),那么我們可以借助apscheduler庫實現(xiàn)定時任務(wù)調(diào)度,這樣就可以完成整個程序的開發(fā)了。廢話不多說,直接上代碼:
獲取疫情實時信息,我們通過查找資料,發(fā)現(xiàn)丁香醫(yī)生的疫情實時信息接口,接口地址為:https://service-f9fjwngp-1252021671.bj.apigw.tencentcs.com/release/pneumonia
在代碼中,小編做了詳細(xì)的注釋,解釋了每一行代碼的含義,大致上代碼邏輯為:通過requests庫請求疫情實時數(shù)據(jù)接口,獲取接口數(shù)據(jù)。
我們只獲取了全國確診病例、疑似病例、死亡病例、治愈病例和更新時間這幾個字段,當(dāng)然接口中還有很多其他的信息同樣可以很簡便的獲取,如較昨日所增加的病例,如某個地區(qū)的詳細(xì)疫情情況等都可以很方便的獲取,在這就留給同學(xué)們?nèi)U展自己想要關(guān)注的疫情內(nèi)容了。
編寫完疫情實時獲取的功能之后,接下來編寫微信定時發(fā)送消息,代碼如下:
在代碼中小編同樣做了很詳細(xì)的注釋,代碼中封裝了一個方法send_news(),該方法實現(xiàn)了將我們獲取的數(shù)據(jù),發(fā)送給指定的微信用戶。
最后我們通過itchat實現(xiàn)微信登陸,然后通過apscheduler實現(xiàn)任務(wù)的調(diào)度,該任務(wù)就是send_news()方法,最后只需要運行py_wechat.py這個文件,就可以輕松的在微信中接受消息啦,比如小編想每隔一小時就給”小花”通知一次疫情的實時情況,效果:
并且這條消息會每個小時都發(fā)送一次,而且每次發(fā)送的都是最新的消息。
最后后祝愿各位同學(xué)在疫情發(fā)生時同樣學(xué)習(xí)進(jìn)步,也希望疫情早日過去,祖國必將繁榮昌盛,戰(zhàn)勝疫情。