Python网络爬虫——新冠疫情实时数据的爬取与可视化
一、选题背景
按照目前状况,新冠疫情已成为全国人民极度关注的重点,不管是每日微博热点还是新闻报告,人们都是非常的关注,不论是浏览量还是评论量都是非常高的。由于近几年大数据行业的蓬勃发展和疫情数据的公开可,数据新闻生产主体的下沉的迹象,更有各大、小众媒体、个人自媒体开始着手组建专业的数据新闻团队,通过获取最新的实时数据,来给新闻增加可读性,和可信度。除此之外还出现了很多的数据服务的提供商,在不收取任何服务费用下,为互联网、广大人民提供数据信息。
自从2020年新冠疫情发生后,至今为止的相关数据新闻已经是非常的巨大了,在每一个重要的事件和时间节点上,都在用数据尝试帮助我们解剖全球的疫情状况。由此可见,新冠疫情数据的新闻报道数量与国内疫情发展变化的状态是基本同步的。为此,本作品是对全国及全球的疫情数据进行实时的爬取,可以更清楚、更直观地了解到目前疫情全国及全球的发展趋势。
二、主题式网络爬虫方案
1、主题式网络爬虫名称
Python网络爬虫——新冠疫情实时数据的爬取与可视化
2、主题是网络爬虫爬取的内容与数据特征分析
爬取的内容为(腾讯新闻的新冠病毒疫情的实时追踪)网址:https://news.qq.com/zt2020/page/feiyan.htm#/
3、主题式网络爬虫设计方案概述
第一部分:爬取网站上的全国各地、美国、全球的疫情数据,对数据进行清洗和处理后分别导成Excel表格存储。
第二部分:对导出的数据进行可视化输出。(本作品的时间是实时的)
三、主题页面的结构特征分析
1、主题页面的结构与特征分析
2、Html页面解析
3、节点(标签)查找方法与遍历方法
四、网络爬虫程序设计
1、数据爬取与采集
2、对数据进行清洗和处理
1 import requests 2 import pandas as pd 3 import json 4 import time 5 from IPython.display import display, HTML # 可以输出正确的表格样式 6 7 # 观察开发者工具network找到url 8 int_url = \'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist\' 9 # 找到显示国内疫情数据的url,如: 10 # \'https://panshi.qq.com/v2/vote/23311878?source=1&callback=jQuery35105457093859854443_1624342555735&_=1624342555736\' 11 # \'jQuery35105457093859854443_1624342555735\'可省略不写,其后面的数字为time.time()*1000,按照其格式构造url,即实时数据的url 12 cn_url = \'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d\' % int(time.time() * 1000) 13 usa_url = \'https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country=美国&=\' 14 china_url = \'https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=chinaDayList,chinaDayAddList,nowConfirmStatis,provinceCompare\'
1 def get_int_page(page_int): # 请求世界各国疫情数据 2 try: 3 response = requests.get(url=page_int) 4 if response.status_code == 200: 5 return response.json()[\'data\'] 6 except requests.exceptions.ConnectionError as e: 7 print(\'Error\', e.args) 8 9 10 def get_cn_page(page_cn): # 请求中国疫情数据 11 try: 12 resp = requests.get(url=page_cn) 13 if resp.status_code == 200: 14 return json.loads(resp.json()[\'data\']) 15 except requests.exceptions.ConnectionError as e: 16 print(\'Error\', e.args) 17 18 19 def get_usa_page(page_usa): # 请求美国每日疫情数据 20 try: 21 response = requests.get(url=page_usa) 22 if response.status_code == 200: 23 return response.json()[\'data\'][453:-2] 24 except requests.exceptions.ConnectionError as e: 25 print(\'Error\', e.args) 26 27 28 def get_china_page(page_china): # 请求中国每日疫情数据 29 try: 30 response = requests.get(url=page_china) 31 if response.status_code == 200: 32 return response.json()[\'data\'] 33 except requests.exceptions.ConnectionError as e: 34 print(\'Error\', e.args)
1 def parse_int_page(items_int): # 解析世界各国疫情数据,并返回一个数据列表用于之后构造DataFrame 2 data_int = [] 3 for item_int in items_int: 4 int_country = item_int.get(\'name\') # 国家 5 int_confirm = item_int.get(\'confirm\') # 累计确诊人数 6 int_dead = item_int.get(\'dead\') # 累计死亡人数 7 int_heal = item_int.get(\'heal\') # 累计治愈人数 8 int_nowConfirm = item_int.get(\'nowConfirm\') # 现有确诊人数 9 int_confirm_add = item_int.get(\'confirmAdd\') # 新增确诊人数 10 int_healCompare = item_int.get(\'healCompare\') # 新增治愈人数 11 int_deadCompare = item_int.get(\'deadCompare\') # 新增死亡人数 12 year = item_int.get(\'y\') # 当前年 13 month, day = item_int.get(\'date\').split(\'.\') # 当前月,日 14 int_date = year + \'-\' + month + \'-\' + day 15 dic = {\'国家\': int_country, \'日期 \': int_date, \'累计确诊\': int_confirm, 16 \'累计死亡\': int_dead, \'累计治愈\': int_heal, \'现有确诊\': int_nowConfirm, 17 \'当日新增确诊\': int_confirm_add, \'当日新增治愈\': int_healCompare, \'当日新增死亡\': int_deadCompare} 18 data_int.append(dic) 19 return data_int 20 21 22 def parse_cn_page(items_cn): # 解析中国疫情数据,将中国的数据加入到世界各国数据的DataFrame中,并且构造每个省的DataFrame 23 cn_date = items_cn[\'lastUpdateTime\'].split(\' \')[0] # 当前日期 24 cn_confirm = items_cn[\'chinaTotal\'][\'confirm\'] # 累计确诊 25 cn_dead = items_cn[\'chinaTotal\'][\'dead\'] # 累计死亡 26 cn_heal = items_cn[\'chinaTotal\'][\'heal\'] # 累计治愈 27 cn_nowConfirm = items_cn[\'chinaTotal\'][\'nowConfirm\'] # 现有确诊(输入型+本地) 28 cn_confirm_add = items_cn[\'chinaAdd\'][\'confirm\'] # 当日新增确诊 29 cn_healCompare = items_cn[\'chinaAdd\'][\'heal\'] # 当日新增治愈 30 cn_deadCompare = items_cn[\'chinaAdd\'][\'dead\'] # 当日新增死亡 31 cn_list = [\'中国\', cn_date, cn_confirm, 32 cn_dead, cn_heal, cn_nowConfirm, 33 cn_confirm_add, cn_healCompare, cn_deadCompare] 34 return cn_list 35 36 37 def parse_province_page(items_cn): # 解析中国各省疫情数据 38 province_list = [] 39 province_items = items_cn[\'areaTree\'][0][\'children\'] 40 for province_item in province_items: 41 province_name = province_item[\'name\'] # 省份 42 province_date = items_cn[\'lastUpdateTime\'].split(\' \')[0] # 当前日期 43 province_confirm = province_item[\'total\'][\'confirm\'] # 累计确诊 44 province_dead = province_item[\'total\'][\'dead\'] # 累计死亡 45 province_heal = province_item[\'total\'][\'heal\'] # 累计治愈 46 province_nowConfirm = province_item[\'total\'][\'nowConfirm\'] # 现有确诊 47 province_confirm_add = province_item[\'today\'][\'confirm\'] # 当日新增确诊 48 healRate = province_item[\'total\'][\'healRate\'] # 治愈率 49 deadRate = province_item[\'total\'][\'deadRate\'] # 死亡率 50 province_dic = {\'省份\': province_name, \'日期\': province_date, 51 \'累计确诊\': province_confirm, \'累计死亡\': province_dead, 52 \'累计治愈\': province_heal, \'现有确诊\': province_nowConfirm, 53 \'当日新增确诊\': province_confirm_add, \'治愈率\': healRate, \'死亡率\': deadRate} 54 province_list.append(province_dic) 55 return province_list 56 57 58 def parse_usa_page(items_usa): # 解析美国每日疫情数据 59 usa_list = [] 60 for item_usa in items_usa: 61 year = item_usa[\'y\'] 62 month, day = item_usa[\'date\'].split(\'.\') 63 date = year + \'-\' + month + \'-\' + day 64 usa_confirm_add = item_usa[\'confirm_add\'] 65 usa_confirm = item_usa[\'confirm\'] 66 usa_heal = item_usa[\'heal\'] 67 usa_dead = item_usa[\'dead\'] 68 usa_dic = {\'日期\': date, \'当日新增\': usa_confirm_add, \'累计确诊\': usa_confirm, \'累计治愈\': usa_heal, \'累计死亡\': usa_dead} 69 usa_list.append(usa_dic) 70 return usa_list 71 72 73 def parse_china_page(items_china): # 解析中国每日疫情数据 74 china_list = [] 75 item_dayadds = items_china[\'chinaDayAddList\'] 76 item_days = items_china[\'chinaDayList\'] 77 for item_dayadd, item_day in zip(item_dayadds, item_days): 78 year = item_dayadd[\'y\'] 79 month, day = item_dayadd[\'date\'].split(\'.\') 80 date = year + \'-\' + month + \'-\' + day 81 china_confirm_add = item_dayadd[\'confirm\'] 82 china_confirm = item_day[\'confirm\'] 83 china_heal = item_day[\'heal\'] 84 china_dead = item_day[\'dead\'] 85 china_dic = {\'日期\': date, \'当日新增\': china_confirm_add, \'累计确诊\': china_confirm, 86 \'累计治愈\': china_heal, \'累计死亡\': china_dead} 87 china_list.append(china_dic) 88 return china_list
1 def set_up_table(data, cn, province, usa, china): # 创建修改DataFrame 2 int_df = pd.DataFrame(data) 3 int_df.index = range(1, 186) 4 int_df.loc[0] = cn 5 int_df = int_df.sort_index(ascending=True) 6 province_df = pd.DataFrame(province) 7 usa_df = pd.DataFrame(usa) 8 china_df = pd.DataFrame(china) 9 return int_df, province_df, usa_df, china_df 10 11 12 def write_table(data1, data2, data3, data4): # 存储表 13 data1.to_excel(\'世界疫情数据.xlsx\', encoding=\'utf-8\') 14 data2.to_excel(\'中国各省疫情数据.xlsx\', encoding=\'utf-8\') 15 data3.to_excel(\'美国每日疫情数据.xlsx\', encoding=\'utf-8\') 16 data4.to_excel(\'中国每日疫情数据.xlsx\', encoding=\'utf-8\') 17 print(\'已存储\')
1 def main(): 2 int_data = get_int_page(int_url) 3 cn_data = get_cn_page(cn_url) 4 usa_data = get_usa_page(usa_url) 5 china_data = get_china_page(china_url) 6 c_list = parse_cn_page(cn_data) 7 p_list = parse_province_page(cn_data) 8 list_data_int = parse_int_page(int_data) 9 u_list = parse_usa_page(usa_data) 10 cn_list = parse_china_page(china_data) 11 # display(set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[3]) # 若直接print,则输出的不是表格 12 write_table(set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[0], 13 set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[1], 14 set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[2], 15 set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[3],) 16 17 if __name__ == \'__main__\': 18 main()
分别查看一下每份爬取的数据
首先我们要知道,因为25日还没过,但是为了统一方便观察都做成25日的数据,所以要知道数据是从24日的24点至25日19:36分(也就是目前运行程序的时间)的实时数据。(各部分没更新的国家例外)
世界疫情数据:
(注意观察美国的数据)
中国各省疫情数据
美国每日疫情数据
(这里爬取的是近两个月内美国的数据)
这里我们可以看到目前美国只更新到23日,其中所有的数据都是没有更新的,所以可以发现前面世界疫情数据的表格中,美国的数据是没有个更新的,只更新到了23日。
所以这里可以看出是美国那边更新的问题。
中国每日疫情数据
(同样为了比较爬取的也是近两个月中国的数据)
4、数据分析与可视化
1 import matplotlib.pyplot as plt 2 import numpy as np 3 %matplotlib inline 4 plt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] 5 import datetime
1 int_df = pd.read_excel(\'世界疫情数据.xlsx\') 2 cn_province_df = pd.read_excel(\'中国各省疫情数据.xlsx\') 3 usa_df = pd.read_excel(\'美国每日疫情数据.xlsx\') 4 china_df = pd.read_excel(\'中国每日疫情数据.xlsx\') 5 int_df = int_df.drop(\'Unnamed: 0\',axis=1) 6 cn_province_df = cn_province_df.drop(\'Unnamed: 0\',axis=1) 7 usa_df = usa_df.drop(\'Unnamed: 0\',axis=1) 8 china_df = china_df.drop(\'Unnamed: 0\',axis=1)
世界累计确诊人数top前20的国家与中国的对比柱状图
1 int_top20 = int_df.head(21) # 取出中国及前20个国家的数据 2 # 作图: 3 plt.title(\'截止\' + int_top20[\'日期 \'][0] + \'的累计确诊人数和累计死亡人数\') 4 5 # plt.xlabel(\'国家\') 6 # plt.ylabel(\'人数\') 7 x = int_top20[\'国家\'] 8 y = int_top20[\'累计确诊\'] 9 10 # plt.ylim(0, max(int_top20[\'累计确诊\'])) 11 plt.xticks(rotation=65) 12 plt.bar(range(len(x)), y,color=\'r\',tick_label=x) 13 14 plt.show()
世界确诊人数top5国家与中国对比子图
1 int_top5 = int_df.head(6) 2 # 作图 3 x = int_top5[\'国家\'] 4 5 plt.subplot(2,2,1) 6 plt.title(\'截止\' + int_top5[\'日期 \'][0] + \'的累计确诊人数\') 7 plt.ylabel(\'人数\') 8 y1 = int_top5[\'累计确诊\'] 9 plt.ylim(0, max(int_top5[\'累计确诊\'])) 10 plt.xticks(rotation=65) 11 plt.bar(range(len(x)), y1,color=\'c\',tick_label=x) 12 13 plt.subplot(2,2,2) 14 plt.title(\'截止\' + int_top5[\'日期 \'][0] + \'的累计死亡人数\') 15 plt.ylabel(\'人数\') 16 y2 = int_top5[\'累计死亡\'] 17 plt.ylim(0, max(int_top5[\'累计死亡\'])) 18 plt.xticks(rotation=65) 19 plt.bar(range(len(x)), y2,color=\'violet\',tick_label=x) 20 21 plt.subplot(2,2,3) 22 plt.title(\'截止\' + int_top5[\'日期 \'][0] + \'的累计治愈人数\') 23 plt.ylabel(\'人数\') 24 y3 = int_top5[\'累计治愈\'] 25 plt.ylim(0, max(int_top5[\'累计治愈\'])) 26 plt.xticks(rotation=65) 27 plt.bar(range(len(x)), y3,color=\'cornflowerblue\',tick_label=x) 28 29 plt.subplot(2,2,4) 30 plt.title(int_top5[\'日期 \'][0] + \'新增确诊\') 31 plt.ylabel(\'人数\') 32 y4 = int_top5[\'当日新增确诊\'] 33 plt.ylim(0, max(int_top5[\'当日新增确诊\'])) 34 plt.xticks(rotation=65) 35 plt.bar(range(len(x)), y4,color=\'black\',tick_label=x) 36 37 plt.subplots_adjust(wspace =0.5, hspace = 1) 38 plt.show()
各省累计确诊人数top20统计柱状图
1 i = datetime.datetime.now() 2 plt.title(str(\'%s\'%i)[:16] + \'的累计确诊人数\') 3 4 label_list = cn_province_df.head(20)[\'省份\'] 5 x = range(len(cn_province_df.head(20)[\'省份\'])) 6 y = cn_province_df.head(20)[\'累计确诊\'] 7 8 plt.ylim(0, max(cn_province_df.head(20)[\'累计确诊\'])) 9 plt.xticks(rotation=90) 10 11 plt.bar(x=x, height=y, width=0.6, alpha=0.8, color=\'c\') 12 plt.ylim(0, 70000) 13 plt.ylabel(\'人数\') 14 plt.xticks([index + 0.2 for index in x], label_list, rotation=65) 15 16 17 plt.show()
累计死亡top10各省死亡率饼图
1 plt.title(\'死亡率\') 2 plt.pie(labels=cn_province_df.head(10)[\'省份\'] ,x=cn_province_df.head(10)[\'死亡率\'],colors=[\'b\',\'r\',\'yellow\',\'c\',\'orange\',\'lime\']) 3 plt.show()
5、根据数据之间的关系,分析两个变量之间的相关系数,画出散点图。
中美近两个月疫情对比(2021.4.23起)
1 x = np.arange(1,len(china_df[\'日期\'])+1) 2 y1 = usa_df[\'当日新增\'] 3 y2 = china_df[\'当日新增\'] 4 plt.figure(figsize=(12,8)) 5 plt.title(\'中美每日新增\') 6 plt.xlabel(\'天数\') 7 plt.ylabel(\'数量\') 8 s1 = plt.plot(x,y1,marker=\'o\',label=\'美国\',color=\'r\' ) # 绘制图形 9 s2 = plt.plot(x,y2,marker=\'o\',label=\'中国\',color=\'c\') 10 plt.xticks(x) 11 plt.legend() 12 plt.show()
1 usa_df.head()
1 x = np.arange(1,len(china_df[\'日期\'])+1) 2 y1 = usa_df[\'累计确诊\'] 3 y2 = china_df[\'累计确诊\'] 4 plt.figure(figsize=(12,8)) 5 plt.title(\'中美累计确诊\') 6 plt.xlabel(\'天数\') 7 plt.ylabel(\'数量\') 8 s1 = plt.plot(x,y1,marker=\'o\',label=\'美国\',color=\'black\' ) # 绘制图形 9 s2 = plt.plot(x,y2,marker=\'o\',label=\'中国\',color=\'red\') 10 plt.xticks(x) 11 plt.legend() 12 plt.show()
7、附上完整程序代码
1 import requests 2 import pandas as pd 3 import json 4 import time 5 from IPython.display import display, HTML # 可以输出正确的表格样式 6 7 # 观察开发者工具network找到url 8 int_url = \'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist\' 9 # 找到显示国内疫情数据的url,如: 10 # \'https://panshi.qq.com/v2/vote/23311878?source=1&callback=jQuery35105457093859854443_1624342555735&_=1624342555736\' 11 # \'jQuery35105457093859854443_1624342555735\'可省略不写,其后面的数字为time.time()*1000,按照其格式构造url,即实时数据的url 12 cn_url = \'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d\' % int(time.time() * 1000) 13 usa_url = \'https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country=美国&=\' 14 china_url = \'https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=chinaDayList,chinaDayAddList,nowConfirmStatis,provinceCompare\' 15 def get_int_page(page_int): # 请求世界各国疫情数据 16 try: 17 response = requests.get(url=page_int) 18 if response.status_code == 200: 19 return response.json()[\'data\'] 20 except requests.exceptions.ConnectionError as e: 21 print(\'Error\', e.args) 22 23 24 def get_cn_page(page_cn): # 请求中国疫情数据 25 try: 26 resp = requests.get(url=page_cn) 27 if resp.status_code == 200: 28 return json.loads(resp.json()[\'data\']) 29 except requests.exceptions.ConnectionError as e: 30 print(\'Error\', e.args) 31 32 33 def get_usa_page(page_usa): # 请求美国每日疫情数据 34 try: 35 response = requests.get(url=page_usa) 36 if response.status_code == 200: 37 return response.json()[\'data\'][453:-2] 38 except requests.exceptions.ConnectionError as e: 39 print(\'Error\', e.args) 40 41 42 def get_china_page(page_china): # 请求中国每日疫情数据 43 try: 44 response = requests.get(url=page_china) 45 if response.status_code == 200: 46 return response.json()[\'data\'] 47 except requests.exceptions.ConnectionError as e: 48 print(\'Error\', e.args) 49 def parse_int_page(items_int): # 解析世界各国疫情数据,并返回一个数据列表用于之后构造DataFrame 50 data_int = [] 51 for item_int in items_int: 52 int_country = item_int.get(\'name\') # 国家 53 int_confirm = item_int.get(\'confirm\') # 累计确诊人数 54 int_dead = item_int.get(\'dead\') # 累计死亡人数 55 int_heal = item_int.get(\'heal\') # 累计治愈人数 56 int_nowConfirm = item_int.get(\'nowConfirm\') # 现有确诊人数 57 int_confirm_add = item_int.get(\'confirmAdd\') # 新增确诊人数 58 int_healCompare = item_int.get(\'healCompare\') # 新增治愈人数 59 int_deadCompare = item_int.get(\'deadCompare\') # 新增死亡人数 60 year = item_int.get(\'y\') # 当前年 61 month, day = item_int.get(\'date\').split(\'.\') # 当前月,日 62 int_date = year + \'-\' + month + \'-\' + day 63 dic = {\'国家\': int_country, \'日期 \': int_date, \'累计确诊\': int_confirm, 64 \'累计死亡\': int_dead, \'累计治愈\': int_heal, \'现有确诊\': int_nowConfirm, 65 \'当日新增确诊\': int_confirm_add, \'当日新增治愈\': int_healCompare, \'当日新增死亡\': int_deadCompare} 66 data_int.append(dic) 67 return data_int 68 69 70 def parse_cn_page(items_cn): # 解析中国疫情数据,将中国的数据加入到世界各国数据的DataFrame中,并且构造每个省的DataFrame 71 cn_date = items_cn[\'lastUpdateTime\'].split(\' \')[0] # 当前日期 72 cn_confirm = items_cn[\'chinaTotal\'][\'confirm\'] # 累计确诊 73 cn_dead = items_cn[\'chinaTotal\'][\'dead\'] # 累计死亡 74 cn_heal = items_cn[\'chinaTotal\'][\'heal\'] # 累计治愈 75 cn_nowConfirm = items_cn[\'chinaTotal\'][\'nowConfirm\'] # 现有确诊(输入型+本地) 76 cn_confirm_add = items_cn[\'chinaAdd\'][\'confirm\'] # 当日新增确诊 77 cn_healCompare = items_cn[\'chinaAdd\'][\'heal\'] # 当日新增治愈 78 cn_deadCompare = items_cn[\'chinaAdd\'][\'dead\'] # 当日新增死亡 79 cn_list = [\'中国\', cn_date, cn_confirm, 80 cn_dead, cn_heal, cn_nowConfirm, 81 cn_confirm_add, cn_healCompare, cn_deadCompare] 82 return cn_list 83 84 85 def parse_province_page(items_cn): # 解析中国各省疫情数据 86 province_list = [] 87 province_items = items_cn[\'areaTree\'][0][\'children\'] 88 for province_item in province_items: 89 province_name = province_item[\'name\'] # 省份 90 province_date = items_cn[\'lastUpdateTime\'].split(\' \')[0] # 当前日期 91 province_confirm = province_item[\'total\'][\'confirm\'] # 累计确诊 92 province_dead = province_item[\'total\'][\'dead\'] # 累计死亡 93 province_heal = province_item[\'total\'][\'heal\'] # 累计治愈 94 province_nowConfirm = province_item[\'total\'][\'nowConfirm\'] # 现有确诊 95 province_confirm_add = province_item[\'today\'][\'confirm\'] # 当日新增确诊 96 healRate = province_item[\'total\'][\'healRate\'] # 治愈率 97 deadRate = province_item[\'total\'][\'deadRate\'] # 死亡率 98 province_dic = {\'省份\': province_name, \'日期\': province_date, 99 \'累计确诊\': province_confirm, \'累计死亡\': province_dead, 100 \'累计治愈\': province_heal, \'现有确诊\': province_nowConfirm, 101 \'当日新增确诊\': province_confirm_add, \'治愈率\': healRate, \'死亡率\': deadRate} 102 province_list.append(province_dic) 103 return province_list 104 105 106 def parse_usa_page(items_usa): # 解析美国每日疫情数据 107 usa_list = [] 108 for item_usa in items_usa: 109 year = item_usa[\'y\'] 110 month, day = item_usa[\'date\'].split(\'.\') 111 date = year + \'-\' + month + \'-\' + day 112 usa_confirm_add = item_usa[\'confirm_add\'] 113 usa_confirm = item_usa[\'confirm\'] 114 usa_heal = item_usa[\'heal\'] 115 usa_dead = item_usa[\'dead\'] 116 usa_dic = {\'日期\': date, \'当日新增\': usa_confirm_add, \'累计确诊\': usa_confirm, \'累计治愈\': usa_heal, \'累计死亡\': usa_dead} 117 usa_list.append(usa_dic) 118 return usa_list 119 120 121 def parse_china_page(items_china): # 解析中国每日疫情数据 122 china_list = [] 123 item_dayadds = items_china[\'chinaDayAddList\'] 124 item_days = items_china[\'chinaDayList\'] 125 for item_dayadd, item_day in zip(item_dayadds, item_days): 126 year = item_dayadd[\'y\'] 127 month, day = item_dayadd[\'date\'].split(\'.\') 128 date = year + \'-\' + month + \'-\' + day 129 china_confirm_add = item_dayadd[\'confirm\'] 130 china_confirm = item_day[\'confirm\'] 131 china_heal = item_day[\'heal\'] 132 china_dead = item_day[\'dead\'] 133 china_dic = {\'日期\': date, \'当日新增\': china_confirm_add, \'累计确诊\': china_confirm, 134 \'累计治愈\': china_heal, \'累计死亡\': china_dead} 135 china_list.append(china_dic) 136 return china_list 137 def set_up_table(data, cn, province, usa, china): # 创建修改DataFrame 138 int_df = pd.DataFrame(data) 139 int_df.index = range(1, 186) 140 int_df.loc[0] = cn 141 int_df = int_df.sort_index(ascending=True) 142 province_df = pd.DataFrame(province) 143 usa_df = pd.DataFrame(usa) 144 china_df = pd.DataFrame(china) 145 return int_df, province_df, usa_df, china_df 146 147 148 def write_table(data1, data2, data3, data4): # 存储表 149 data1.to_excel(\'世界疫情数据.xlsx\', encoding=\'utf-8\') 150 data2.to_excel(\'中国各省疫情数据.xlsx\', encoding=\'utf-8\') 151 data3.to_excel(\'美国每日疫情数据.xlsx\', encoding=\'utf-8\') 152 data4.to_excel(\'中国每日疫情数据.xlsx\', encoding=\'utf-8\') 153 print(\'已存储\') 154 def main(): 155 int_data = get_int_page(int_url) 156 cn_data = get_cn_page(cn_url) 157 usa_data = get_usa_page(usa_url) 158 china_data = get_china_page(china_url) 159 c_list = parse_cn_page(cn_data) 160 p_list = parse_province_page(cn_data) 161 list_data_int = parse_int_page(int_data) 162 u_list = parse_usa_page(usa_data) 163 cn_list = parse_china_page(china_data) 164 # display(set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[3]) # 若直接print,则输出的不是表格 165 write_table(set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[0], 166 set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[1], 167 set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[2], 168 set_up_table(list_data_int, c_list, p_list, u_list, cn_list)[3],) 169 170 if __name__ == \'__main__\': 171 main() 172 import matplotlib.pyplot as plt 173 import numpy as np 174 %matplotlib inline 175 plt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] 176 import datetime 177 int_df = pd.read_excel(\'世界疫情数据.xlsx\') 178 cn_province_df = pd.read_excel(\'中国各省疫情数据.xlsx\') 179 usa_df = pd.read_excel(\'美国每日疫情数据.xlsx\') 180 china_df = pd.read_excel(\'中国每日疫情数据.xlsx\') 181 int_df = int_df.drop(\'Unnamed: 0\',axis=1) 182 cn_province_df = cn_province_df.drop(\'Unnamed: 0\',axis=1) 183 usa_df = usa_df.drop(\'Unnamed: 0\',axis=1) 184 china_df = china_df.drop(\'Unnamed: 0\',axis=1) 185 int_top20 = int_df.head(21) # 取出中国及前20个国家的数据 186 # 作图: 187 plt.title(\'截止\' + int_top20[\'日期 \'][0] + \'的累计确诊人数和累计死亡人数\') 188 189 # plt.xlabel(\'国家\') 190 # plt.ylabel(\'人数\') 191 x = int_top20[\'国家\'] 192 y = int_top20[\'累计确诊\'] 193 194 # plt.ylim(0, max(int_top20[\'累计确诊\'])) 195 plt.xticks(rotation=65) 196 plt.bar(range(len(x)), y,color=\'r\',tick_label=x) 197 198 plt.show() 199 int_top5 = int_df.head(6) 200 # 作图 201 x = int_top5[\'国家\'] 202 203 plt.subplot(2,2,1) 204 plt.title(\'截止\' + int_top5[\'日期 \'][0] + \'的累计确诊人数\') 205 plt.ylabel(\'人数\') 206 y1 = int_top5[\'累计确诊\'] 207 plt.ylim(0, max(int_top5[\'累计确诊\'])) 208 plt.xticks(rotation=65) 209 plt.bar(range(len(x)), y1,color=\'c\',tick_label=x) 210 211 plt.subplot(2,2,2) 212 plt.title(\'截止\' + int_top5[\'日期 \'][0] + \'的累计死亡人数\') 213 plt.ylabel(\'人数\') 214 y2 = int_top5[\'累计死亡\'] 215 plt.ylim(0, max(int_top5[\'累计死亡\'])) 216 plt.xticks(rotation=65) 217 plt.bar(range(len(x)), y2,color=\'violet\',tick_label=x) 218 219 plt.subplot(2,2,3) 220 plt.title(\'截止\' + int_top5[\'日期 \'][0] + \'的累计治愈人数\') 221 plt.ylabel(\'人数\') 222 y3 = int_top5[\'累计治愈\'] 223 plt.ylim(0, max(int_top5[\'累计治愈\'])) 224 plt.xticks(rotation=65) 225 plt.bar(range(len(x)), y3,color=\'cornflowerblue\',tick_label=x) 226 227 plt.subplot(2,2,4) 228 plt.title(int_top5[\'日期 \'][0] + \'新增确诊\') 229 plt.ylabel(\'人数\') 230 y4 = int_top5[\'当日新增确诊\'] 231 plt.ylim(0, max(int_top5[\'当日新增确诊\'])) 232 plt.xticks(rotation=65) 233 plt.bar(range(len(x)), y4,color=\'black\',tick_label=x) 234 235 plt.subplots_adjust(wspace =0.5, hspace = 1) 236 plt.show() 237 cn_province_df = cn_province_df.sort_values(\'累计确诊\', ascending=False) # 以累计确诊数降序排序 238 i = datetime.datetime.now() 239 plt.title(str(\'%s\'%i)[:16] + \'的累计确诊人数\') 240 241 label_list = cn_province_df.head(20)[\'省份\'] 242 x = range(len(cn_province_df.head(20)[\'省份\'])) 243 y = cn_province_df.head(20)[\'累计确诊\'] 244 245 plt.ylim(0, max(cn_province_df.head(20)[\'累计确诊\'])) 246 plt.xticks(rotation=90) 247 248 plt.bar(x=x, height=y, width=0.6, alpha=0.8, color=\'c\') 249 plt.ylim(0, 70000) 250 plt.ylabel(\'人数\') 251 plt.xticks([index + 0.2 for index in x], label_list, rotation=65) 252 253 254 plt.show() 255 plt.title(\'死亡率\') 256 plt.pie(labels=cn_province_df.head(10)[\'省份\'] ,x=cn_province_df.head(10)[\'死亡率\'],colors=[\'b\',\'r\',\'yellow\',\'c\',\'orange\',\'lime\']) 257 plt.show() 258 x = np.arange(1,len(china_df[\'日期\'])+1) 259 y1 = usa_df[\'当日新增\'] 260 y2 = china_df[\'当日新增\'] 261 plt.figure(figsize=(12,8)) 262 plt.title(\'中美每日新增\') 263 plt.xlabel(\'天数\') 264 plt.ylabel(\'数量\') 265 s1 = plt.plot(x,y1,marker=\'o\',label=\'美国\',color=\'r\' ) # 绘制图形 266 s2 = plt.plot(x,y2,marker=\'o\',label=\'中国\',color=\'c\') 267 plt.xticks(x) 268 plt.legend() 269 plt.show() 270 usa_df.head() 271 x = np.arange(1,len(china_df[\'日期\'])+1) 272 y1 = usa_df[\'累计确诊\'] 273 y2 = china_df[\'累计确诊\'] 274 plt.figure(figsize=(12,8)) 275 plt.title(\'中美累计确诊\') 276 plt.xlabel(\'天数\') 277 plt.ylabel(\'数量\') 278 s1 = plt.plot(x,y1,marker=\'o\',label=\'美国\',color=\'black\' ) # 绘制图形 279 s2 = plt.plot(x,y2,marker=\'o\',label=\'中国\',color=\'red\') 280 plt.xticks(x) 281 plt.legend() 282 plt.show()
五、总结
1.经过对主题数据的分析与可视化,可以得到哪些结论?是否达到预期的目标?
扇形图显示我国湖北的死亡率占比较大百分比,柱状图显示湖北累计确诊人数最高,可见湖北是我国高风险地区,通过中美两国的每日确诊折线图对比,可以看出中国在疫情的防范和控制做的相对好,没有过大的波动,处于一个稳定的控制状态,我相信中国是可以扛过这次的疫情的。通过本次的疫情数据爬取实时数据项目,确实已经达到了实时数据的预期目标。
2.在完成此设计过程中,得到哪些收获?以及要改进的建议?
通过本次的疫情实时数据爬取及可视化的项目,我明白了再做一个项目时,不应该着急的去敲代码,而是应该先做好需求分析,了解技术难点,这样才能选择需要的技术方法,框架。