首先,我是模仿這位大佬的博客寫的,因爲水平有限有些代碼看不太懂,所以做了改動
https://blog.csdn.net/xufive/article/details/104093197
然後就是我沒有系統的學過Python所以代碼比較凌亂,有錯誤請指正,謝謝!
數據說明 數據來源:全部數據來源於國家衛健委、各省市區衛健委、各省市區政府以及港澳臺官方渠道。 實時數據方面,騰訊新聞的統計方法如下: 1.國家衛健委公佈數據時,全國總數與國家衛健委保持一致。 2.各省衛健委陸續公佈數據,如果各省數據總和已經超過之前國家衛健委總數,則直接使用各省數據總和作爲全國總數。(“疑似病例”僅使用國家衛健委每天公佈的共有疑似病例總數,而不做新增累計) 3.“全國確診”、“治癒人數”和“死亡人數”的“較上日”是指每兩天間的新增數值,由當前的全國總數減去國家衛健委前一天公佈的數據得到。這個值會隨着全國總數的變動而實時變化。 4.疑似病例的“較上日”數據取自國家衛健委每日最新公佈的“新增疑似病例數”。點擊【疑似病例】可查看較上日現有疑似病例數的絕對值差額。 5.各省衛健委公佈數據的發佈時間和統計時間段各不相同,故而會在部分時段出現國家總數不等於分省數據之和。
目標網站是:https://news.qq.com/zt2020/page/feiyan.htm?from=timeline&isappinstalled=0#charts
首先,我想要獲取的數據是全國確診總人數、疑似病例人數、治癒人數和死亡人數,如下圖。
還有各個省份的各個城市的相關數據。
整體思路就是獲取-》解析-》保存-》發送
1. 獲取
def get_html_page(url: str):
header = {
"Host": "view.inews.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0",
"Accept": "*/*",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Referer": "https://news.qq.com/zt2020/page/feiyan.htm?from=timeline&isappinstalled=0",
"Cookie": "此處粘貼自己的cookies",
"TE": "Trailers"
}
request = requests.get(url=url, headers=header).text
get_data(request)
2. 解析並保存
解析出來的數據有各個城市和各個省份的,一個文件保存的各個省份的,一個文件保存的是各個城市和省份的。兩個文件 都有彙總的數據。
def get_data(request: str):
data = re.findall(r"[(](.*?)[)]", request)[0]
json_data = json.loads(data)["data"]
json_data_chinaTotal = json.loads(json_data)["chinaTotal"]
json_data_lastUpdateTime = json.loads(json_data)["lastUpdateTime"]
total_data = {
"total_confirm": dict(json_data_chinaTotal).get("confirm"),
"total_suspect": dict(json_data_chinaTotal).get("suspect"),
"total_dead": dict(json_data_chinaTotal).get("dead"),
"total_heal": dict(json_data_chinaTotal).get("heal"),
"lastUpdateTime": json_data_lastUpdateTime
}
json_data_areaTree_children = json.loads(json_data)["areaTree"][0]
list_data_allProvince = dict(json_data_areaTree_children).get("children")
list_data_all_province = []
list_data_all_city = []
for dict_data_of_one_province in list_data_allProvince:
province_name = dict_data_of_one_province.get("name")
province_total_confirm = dict_data_of_one_province.get("total").get("confirm")
province_total_dead = dict_data_of_one_province.get("total").get("dead")
province__total_heal = dict_data_of_one_province.get("total").get("heal")
province_element = {
"name": province_name,
"confirm": province_total_confirm,
"dead": province_total_dead,
"heal": province__total_heal
}
list_data_all_province.append(province_element)
list_data_citys_in_province = dict_data_of_one_province.get("children")
for dict_data_city in list_data_citys_in_province:
city_name = dict_data_city.get("name")
city_total_confirm = dict_data_city.get("total").get("confirm")
city_total_dead = dict_data_city.get("total").get("dead")
city_total_heal = dict_data_city.get("total").get("heal")
city_elemet = {
"name": city_name,
"confirm": city_total_confirm,
"dead": city_total_dead,
"heal": city_total_heal
}
list_data_all_city.append(city_elemet)
data = {
"total": total_data,
"else": list_data_all_city + list_data_all_province
}
province_data = {
"total": total_data,
"else": list_data_all_province
}
save_data(data, "data_1.json")
save_data(province_data, "province_data.json")
def save_data(data, file_path):
f = open(file_path, "w", encoding="utf-8")
json.dump(data, f)
f.close()
3. 發送數據
這裏的發送數據有兩個,包括髮送所有的數據(各個省份、各個城市)、發送各個省份的數據。
def read_file(path):
f = open(path, "r", encoding="utf-8")
data = json.load(f)
f.close()
return data
def send_province_data():
userfinfo = itchat.search_friends("T@") # 爲好友暱稱
userid = userfinfo[0]["UserName"] # 獲取用戶id
data = dict(read_file("province_data.json"))
total_confirm = data.get("total").get("total_confirm")
total_suspect = data.get("total").get("total_suspect")
total_dead = data.get("total").get("total_heal")
total_heal = data.get("total").get("total_heal")
total_last_update_time = data.get("total").get("lastUpdateTime")
itchat.send(
"全國確診:{}\n全國疑似:{}\n全國死亡:{}\n全國治癒:{}\n最後更新時間:{}".format(total_confirm, total_suspect, total_dead,
total_heal, total_last_update_time),
userid) # 通過用戶id發送信息
list_data_else = list(data.get("else"))
for province_data in list_data_else:
time.sleep(0.9)
province_data = dict(province_data)
itchat.send(
"地區:{}\n確診:{}\n死亡:{}\n治癒:{}".format(province_data.get("name"), province_data.get("confirm"), province_data.get("dead"),
province_data.get("heal")), userid)
def send_all_data():
userfinfo = itchat.search_friends("虎子1") # 爲好友暱稱
userid = userfinfo[0]["UserName"] # 獲取用戶id
data = dict(read_file())
total_confirm = data.get("total").get("total_confirm")
total_suspect = data.get("total").get("total_suspect")
total_dead = data.get("total").get("total_heal")
total_heal = data.get("total").get("total_heal")
total_last_update_time = data.get("total").get("lastUpdateTime")
itchat.send(
"全國確診:{}\n全國疑似:{}\n全國死亡:{}\n全國治癒:{}\n最後更新時間:{}".format(total_confirm, total_suspect, total_dead,
total_heal, total_last_update_time),
userid) # 通過用戶id發送信息
list_data_else = list(data.get("else"))
for city_data in list_data_else:
time.sleep(0.1)
city_data = dict(city_data)
itchat.send(
"名稱:{}\n確診:{}\n死亡:{}\n治癒:{}".format(city_data.get("name"), city_data.get("confirm"), city_data.get("dead"),
city_data.get("heal")), userid)
4. 主函數
if __name__ == '__main__':
itchat.auto_login(hotReload=True)
get_html_page(
"https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery34106528980082724699_1581051212376&_=" + str(
int(time.time() * 1000)))
send_province_data()
最後獻上今日壁紙