一、選題的背景
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的運用,還了解了疫情對地球的各個國家的影響