Python實戰 中國疫情(包括港澳臺)各省各城市實時數據獲取 併發送給微信好友(裝*)

首先,我是模仿這位大佬的博客寫的,因爲水平有限有些代碼看不太懂,所以做了改動

 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()

最後獻上今日壁紙

章若楠壁紙

 

發佈了20 篇原創文章 · 獲贊 14 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章