一、选题的背景
2019新型冠状病毒,因2019年武汉病毒性肺炎病例而被发现,2020年1月12日被世界卫生组织命名。冠状病毒是一个大型病毒家族,已知可引起感冒以及中东呼吸综合征和严重急性呼吸综合征等较严重疾病。新型冠状病毒是以前从未在人体中发现的冠状病 毒新毒株。 2020年新型冠状病毒在全球肆虐,确诊人数快速攀升,全世界确诊病例突破两百万,各地的景区以及娱乐场所封闭,街道上空无一人。随着疫情的严重化,人们对疫情的关注度也越来越高。在疫情期间,随时了解疫情的情况成为人们每天必不可少的习惯之一。
二、主题式网络爬虫设计方案
1.名称:python爬虫助力疫情数据 2.爬取内容的数据与分析特征爬取国内外的疫情分析。 3.爬虫设计方案先确定主题,爬取现存疫情数据,设计爬取程序进行爬取,并以csv形式储存,然后进行数据分析和清洗,再进行图形图像绘制。最后保存数据。
三、主题页面的结构特征分析
1.数据源在一系列的查找下,以下几个数据链接,里面包含的都是json类型的数据。
海外国家疫情数据: https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist
国内疫情数据:https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5
国内每日疫情情况数据:https://view.inews.qq.com/g2/getOnsInfo?name=disease_other
海外疫情治愈率和死亡率top10的国家数据:https://api.inews.qq.com/newsqa/v1/automation/modules/list?modules=FAutoCountryWeekCompRank,FAutoContinentConfirmStatis,FAutoConfirmMillionRankList,FAutoHealDeadRateRankList
2.疫情数据可视化
在数据可视化阶段,我们对数据爬虫和数据预处理阶段获取的数据进行可视化呈现,下面分图表对绘图过程做简要的概述和图表呈现,并附上相应代码。
绘图的主要流程为:
1.导入所需要的库(pandas读取文件数据,pyecharts绘图);
2.pandas读取需绘图的数据,并将数据转化成列表格式,整合在一起;
3.将数据添加到图框中,然后根据需要添加图形的设置;
3.数据预处理
利用requests库爬取疫情数据之后,我们获得的是json形式的数据,可以利用json库对json数据进行解析,利用列表推导式对json里面的数据提取出来,组合成pandas库里的DataFrame数据格式,再调用pandas库的to_csv方法,把数据保存成csv文件。从json文件中提取数据的复杂度与json文件组织数据的复杂度相关,其中对国内疫情数据进行提取的时候,利用pandas库的常见方式。
1.import json 2 import requests 3 import pandas as pd 4 #爬虫代码 5 def spider_data(url): 6 headers = { 7 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE' 8 } 9 response = requests.get(url = url, headers = headers) 10 data = response.json()["data"] 11 return data 12 13 def spider_overseas(): 14 #爬取海外疫情数据 15 overseas_data = spider_data("https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist") 16 overseas_data= [(i["name"],i["confirmAdd"],i["confirm"],i["dead"],i["heal"]) for i in overseas_data] 17 overseas_data = pd.DataFrame(overseas_data) 18 new_cols1 = ['国家', '新增确诊','累计确诊','治愈', '死亡'] 19 overseas_data.columns = new_cols1 20 overseas_data.to_csv('data\overseas_data.csv', encoding='utf-8') 21 22 def spider_china(): 23 #爬取国内疫情数据 24 china_data = spider_data("https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5") 25 china_data = json.loads(china_data) 26 27 #国内疫情数据初步预处理 28 china_city_data = china_data["areaTree"][0]["children"] 29 city_total_list = [] 30 for i in range(len(china_city_data)): 31 province = china_city_data[i]['name'] 32 province_list = china_city_data[i]['children'] 33 city_list = [(province,a["name"],a["total"])for a in province_list] 34 city_total_list.extend(city_list) 35 city_total_list = pd.DataFrame(city_total_list) 36 new_cols2 = ['省份', '城市','共计'] 37 city_total_list.columns = new_cols2 38 39 #国内疫情数据二次预处理 40 total_data = pd.DataFrame(city_total_list["共计"].values.tolist())[["nowConfirm","confirm","dead","heal"]] 41 city_total_list = pd.concat([city_total_list,total_data],axis = 1) 42 city_total_list.drop('共计',axis=1, inplace=True) 43 44 #保存数据 45 city_total_list.to_csv('data\city_total_list.csv', encoding='utf-8') 46 47 def spider_chinaDayData(): 48 #爬取中国每日疫情情况数据 49 china_everday_data = spider_data("https://view.inews.qq.com/g2/getOnsInfo?name=disease_other") 50 chinaDayList = json.loads(china_everday_data)["chinaDayList"] 51 52 chinaDayData = [(i["date"],i["confirm"],i["nowConfirm"],i["dead"],i["heal"]) for i in chinaDayList] 53 chinaDayData = pd.DataFrame(chinaDayData) 54 chinaDayData.columns = ['日期', '累计确诊','现有确诊','死亡','痊愈'] 55 chinaDayData.to_csv('data\chinaDayData.csv', encoding='utf-8') 56 def spider_rate(): 57 #爬取海外疫情治愈率和死亡率前10的国家数据并保存成csv文件 58 rate_data = spider_data("https://api.inews.qq.com/newsqa/v1/automation/modules/list?modules=FAutoCountryWeekCompRank,FAutoContinentConfirmStatis,FAutoConfirmMillionRankList,FAutoHealDeadRateRankList") 59 rate_data = rate_data['FAutoHealDeadRateRankList'] 60 61 #将死亡率前10,和治愈率前十的数据取出并保存成csv文件 62 world_deadHead = rate_data['deadHead'] 63 world_healHead = rate_data['healHead'] 64 65 pd.DataFrame(world_deadHead).to_csv("data\world_deadrate10.csv") 66 pd.DataFrame(world_healHead).to_csv("data\world_healrate10.csv") 67 68 #总的运行函数 69 def run(): 70 spider_overseas() 71 spider_china() 72 spider_chinaDayData() 73 spider_rate()

1 import pandas as pd 2 from pyecharts.charts import Line 3 from pyecharts import options as opts 4 from pyecharts.globals import ThemeType 5 6 def plot_chinaDayData()-> Line: 7 data = pd.read_csv('data\chinaDayData.csv') 8 df = pd.DataFrame(data) 9 #数据 10 date=df.iloc[:, 1].tolist() 11 nowconfirm=df.iloc[:, 3].tolist() 12 confirm=df.iloc[:, 2].tolist() 13 dead=df.iloc[:,4].tolist() 14 heal=df.iloc[:, 5].tolist() 15 date=[str(i) for i in date] 16 17 line=( 18 Line(init_opts=opts.InitOpts(width="1000px", height="500px")) 19 .add_xaxis(date) 20 .add_yaxis( 21 "现确诊", 22 nowconfirm, 23 linestyle_opts=opts.LineStyleOpts(color='blue',width=1, type_="dashed"), 24 yaxis_index=0, 25 symbol_size=3, 26 itemstyle_opts=opts.ItemStyleOpts( 27 color="blue" 28 ), 29 ) 30 .add_yaxis( 31 "确诊", 32 confirm, 33 linestyle_opts=opts.LineStyleOpts(color='red',width=1, type_="dashed"), 34 yaxis_index=0, 35 symbol='circle',#','circle' 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none' 36 symbol_size=3, 37 itemstyle_opts=opts.ItemStyleOpts( 38 color="red" 39 ), 40 ) 41 .add_yaxis( 42 "死亡", 43 dead, 44 linestyle_opts=opts.LineStyleOpts(color='lightsalmon',width=1, type_="dashed"), 45 yaxis_index=1, 46 symbol='diamond', 47 symbol_size=5, 48 itemstyle_opts=opts.ItemStyleOpts( 49 color="lightsalmon" 50 ), 51 ) 52 .add_yaxis( 53 "治愈", 54 heal, 55 linestyle_opts=opts.LineStyleOpts(color='green',width=1, type_="dashed"), 56 yaxis_index=1, 57 symbol='triangle', 58 symbol_size=5, 59 itemstyle_opts=opts.ItemStyleOpts( 60 color="green" 61 ), 62 ) 63 .extend_axis( 64 yaxis=opts.AxisOpts( 65 type_="value", 66 name='死亡/治愈', 67 position="right", 68 ) 69 ) 70 .extend_axis( 71 yaxis=opts.AxisOpts( 72 type_="value", 73 split_number=10, 74 min_=2000, 75 name='现确诊/累计确诊', 76 position="left", 77 78 ) 79 ) 80 .set_global_opts( 81 title_opts=opts.TitleOpts(title="中国每日疫情数据"), 82 xaxis_opts=opts.AxisOpts(name='日期',name_location='end',name_rotate=-30), 83 yaxis_opts=opts.AxisOpts( 84 axistick_opts=opts.AxisTickOpts(is_show=True), 85 splitline_opts=opts.SplitLineOpts(is_show=True),), #y网格线 86 tooltip_opts=opts.TooltipOpts(trigger="axis"), #交互 87 datazoom_opts=opts.DataZoomOpts( 88 is_show=True, 89 type_="slider", 90 is_realtime=True, 91 range_start=20, 92 range_end=80, 93 orient="horizontal" #"vertical" 94 ) #x轴值缩放 95 ) 96 .set_series_opts( 97 label_opts=opts.LabelOpts(is_show=False),#去掉线上的数字 98 ) 99 ) 100 101 line.render(path='visual_html\中国每日疫情数据折线图.html') 102 return line

1 import pandas as pd 2 from pyecharts import options as opts 3 from pyecharts.charts import Map 4 from pyecharts.globals import ThemeType 5 6 def plot_china_provinces()-> Map: 7 data = pd.read_csv('data\province_data.csv') 8 df = pd.DataFrame(data) 9 10 Province = df.iloc[:, 0].tolist() 11 Confirm = df.iloc[:, 2].tolist() 12 data = [list(i) for i in zip(Province, Confirm)] 13 14 #背景颜色和主题 15 map = (Map(init_opts=opts.InitOpts(bg_color='#eee', theme=ThemeType.ROMA)) 16 .add('确诊病例', data, 'china', is_map_symbol_show=False) 17 .set_series_opts(textStyle_opts=opts.TextStyleOpts(font_size=12)) 18 .set_global_opts(title_opts=opts.TitleOpts(title='全国各省确诊案例',pos_left='center'), 19 #分段显示的设置 20 visualmap_opts=opts.VisualMapOpts( 21 is_piecewise= True, 22 #自定义分段 23 pieces=[ 24 {'min': 10000, 'label': '>=10000人', 'color': '#BC8F8F'}, 25 {'min': 1000, 'max': 9999, 'label': '1000-9999人', 'color': '#FFDEAD'}, 26 {'min': 500, 'max': 999, 'label': '500-999人', 'color': '#FFA500'}, 27 {'min': 100, 'max': 499, 'label': '100-499人', 'color': '#B22222'}, 28 {'min': 10, 'max': 99, 'label': '10-99人', 'color': '#D2691E'}, 29 {'min': 1, 'max': 9, 'label': '1-9人', 'color': '#E9967A'} 30 ], 31 ), 32 legend_opts=opts.LegendOpts( 33 is_show=False 34 ), 35 36 37 38 39 ) 40 41 ) 42 map.render(path='visual_html\中国省份疫情数据地图.html') 43 return map

1 import pandas as pd 2 from pyecharts.charts import Bar 3 from pyecharts import options as opts 4 5 def plot_overseasBar()-> Bar: 6 data = pd.read_csv('data\overseas_data.csv') 7 df = pd.DataFrame(data) 8 9 country=df.iloc[:, 1].tolist() 10 newconfirm=df.iloc[:, 2].tolist() 11 confirm=df.iloc[:, 3].tolist() 12 heal=df.iloc[:, 4].tolist() 13 dead=df.iloc[:,5].tolist() 14 15 bar=( 16 Bar(init_opts=opts.InitOpts(width="1000px", height="500px")) 17 .add_xaxis(country) 18 .add_yaxis( 19 "新增确诊", 20 newconfirm, 21 22 ) 23 .add_yaxis( 24 "累计确诊", 25 confirm, 26 27 ) 28 29 .add_yaxis( 30 "治愈", 31 heal, 32 ) 33 .add_yaxis( 34 "死亡", 35 dead, 36 ) 37 .extend_axis( 38 yaxis=opts.AxisOpts( 39 type_="value", 40 name='人数/人', 41 position="left", 42 ) 43 ) 44 .set_global_opts( 45 title_opts=opts.TitleOpts(title="国外疫情数据"), 46 tooltip_opts=opts.TooltipOpts(trigger="axis"), 47 xaxis_opts=opts.AxisOpts(name='国家'), 48 yaxis_opts=opts.AxisOpts( 49 axistick_opts=opts.AxisTickOpts(is_show=True), 50 splitline_opts=opts.SplitLineOpts(is_show=False)), 51 52 #滚动条 53 datazoom_opts=opts.DataZoomOpts( 54 is_show=True, 55 type_="slider", 56 is_realtime=True, 57 range_start=30, 58 range_end=90, 59 orient="horizontal" 60 ) 61 ) 62 ) 63 bar.render(path='visual_html\海外疫情数据条形图.html') 64 return bar

。
四.总结
学习了如何使用Python爬取疫情数据,如何利用pandas对爬取到的疫情数据进行预处理操作,并保存成csv文件,如何从获取的疫情数据中探索数据背后的疫情情况及发展,如何使用pyecharts对获取的数据进行可视化绘图
展示。可以直接从图片直观看出疫情的影响。 不仅仅对python的运用,还了解了疫情对地球的各个国家的影响