Python 使用爬蟲獲取新冠疫情歷史資料
前言:
2019年底,一場突如其來的新冠疫情打破了人們準備歡度春節的節奏,許多人因為疫情無法過個好年,而接下來的疫情發展超出了所有人的預料...截至2021年6月,全球確診已達1億7000餘萬,在這次疫情中死去的人數三百餘萬...
我們每天都可以在各個新聞報道或者網站上看到疫情的實時資料,但這些資料大多是零碎的,我們無法直觀的感受這次疫情在全球範圍內的影響。
在學習了爬蟲以後,我們可以利用爬蟲獲取各個時間和各個地區的疫情情況,然後將這些資料視覺化,可以讓我們一目瞭然疫情動態,還可以加深我們對python的掌握和運用。
資料來源:
丁香醫生:https://ncov.dxy.cn/ncovh5/view/pneumonia
頁面分析:
要爬取網頁資料,首先要了解網頁結構和網頁的資料流,F12檢視網頁原始碼:
可以發現<script id="getListByCountryTypeService2true">這裡對應著每一個國家的相關資料,其中發現有一個屬性statisticsData,指向的是json資料鏈接:
隨便下載一個開啟看看:
Data中包含的欄位:
confirmedCount\confirmedIncr\curedCount\curedIncr\curentConfirmedCount\currentConfirmedIncr\dateId\deadCount\deadIncr\suspectedCount\suspectedCountIncr
頁面下方還有國內各個省市的資料:
同樣,這些資料後面statisticsData也指向一個json資料鏈接,檢視裡面的資料欄位。資料非常的全面,由此通過分析頁面我們找到了中國和世界的疫情詳細歷史資料。
下面開始爬取:
第一步
# 獲取網頁中包含資料鏈接的列表資訊 import requests import re import json from bs4 import BeautifulSoup def getOriHtmlText(url,code='utf-8'): try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36' } r=requests.get(url,timeout=30,headers=headers) r.raise_for_status() r.encoding=code return r.text except: return "There are some errors when get the original html!" def getTheList(url): html=getOriHtmlText(url) soup=BeautifulSoup(html,'html.parser') htmlBodyText=soup.body.text # 獲取國家資料 worldDataText=htmlBodyText[htmlBodyText.find('window.getListByCountryTypeService2true = '):] worldDataStr = worldDataText[worldDataText.find('[{'):worldDataText.find('}catch')] worldDataJson=json.loads(worldDataStr) with open("../data/worldData.json","w") as f: json.dump(worldDataJson,f) print("寫入國家資料檔案成功!") # 獲取各省份資料 provinceDataText = htmlBodyText[htmlBodyText.find('window.getAreaStat = '):] provinceDataStr = provinceDataText[provinceDataText.find('[{'):provinceDataText.find('}catch')] provinceDataJson=json.loads(provinceDataStr) with open("../data/provinceData.json","w") as f: json.dump(provinceDataJson,f) print("寫入省份資料檔案成功!") getTheList("https://ncov.dxy.cn/ncovh5/view/pneumonia")
獲得兩個包含資料鏈接的.json檔案:
第二步
清洗資料獲得連結真實所對應的資料
# 處理所獲得的含連結的列表,獲取真實所對應的資料 import json import requests import time def deal_worlddatalist(): with open("../data/worldData.json",'r') as f: worldDataJson=json.load(f) for i in range(0,len(worldDataJson)): print(worldDataJson[i]['provinceName']+" "+worldDataJson[i]['countryShortCode']+" "+worldDataJson[i]['countryFullName']+" "+worldDataJson[i]['statisticsData']) return worldDataJson def get_the_world_data(): # 獲取每個國家對應的json worldDataJson=deal_worlddatalist() # 記錄錯誤數量 errorNum=0 for i in range(0,len(worldDataJson)): provinceName=worldDataJson[i]['provinceName'] try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36' } r = requests.get(worldDataJson[i]['statisticsData'], timeout=30, headers=headers) r.raise_for_status() r.encoding = 'utf-8' everCountryDataJson = json.loads(r.text) toWriteFilePath="../data/worldData/"+provinceName+".json" with open(toWriteFilePath,'w') as file: json.dump(everCountryDataJson, file) print(provinceName + " 資料得到!") time.sleep(10) except: errorNum+=1 print("在獲取 "+provinceName+" 資料時出錯!") print("各國資料獲取完成!") print("錯誤資料量為:"+str(errorNum)) # 處理各省資料列表 def deal_provincedatalist(): with open("../data/provinceData.json",'r') as f: provinceDataJson=json.load(f) for i in range(0,len(provinceDataJson)): print(provinceDataJson[i]['provinceName']+" "+provinceDataJson[i]['provinceShortName']+" "+provinceDataJson[i]['statisticsData']) return provinceDataJson # 獲取各個省份對應的json def get_the_province_data(): provinceDataJson=deal_provincedatalist() # 統計出現爬取錯誤的資料數量 errorNum = 0 for i in range(0,len(provinceDataJson)): provinceName=provinceDataJson[i]['provinceName'] try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' } r=requests.get(provinceDataJson[i]['statisticsData'],timeout=30,headers=headers) r.raise_for_status() r.encoding='utf-8' everProvinceDataJson=json.loads(r.text) toWriteFilePath="../data/provinceData/"+provinceName+".json" with open(toWriteFilePath,'w') as file: json.dump(everProvinceDataJson,file) print(provinceName+" 資料得到!") time.sleep(15) except: errorNum+=1 print("在獲取 "+provinceName+" 資料時出錯") print("各省份資料獲取完成!") print("錯誤資料量為:"+str(errorNum)) get_the_world_data() get_the_province_data()
成功獲取國內和外國疫情的json資料
獲取的資料都是json格式的,現在我們將資料匯入資料庫,這裡使用的是mysql,先給python安裝pymysql庫。
我們在目標資料夾建立一個.sql的檔案,用文字開啟編寫建表語句:
執行mysql,首先先建立一個數據庫
CREATE DATABASE test_db; USE test_db; CREATE TABLE china_provincedata( id INT PRIMARY KEY , confirmedCount INT , confirmedIncr INT, curedCount INT, curedIncr INT , currentConfirmedCount INT , currentConfirmedIncr INT , dateId INT , deadCount INT, deadIncr INT, suspectedCount INT, suspectedCountIncr INT, provinceName text, provinceShortName text ); CREATE TABLE countrydata( id INT PRIMARY KEY , confirmedCount INT , confirmedIncr INT, curedCount INT, curedIncr INT , currentConfirmedCount INT , currentConfirmedIncr INT , dateId INT , deadCount INT, deadIncr INT, suspectedCount INT, suspectedCountIncr INT, countryName text, countryShortCode text, continent text, countryFullName text ); CREATE TABLE world_total_data( id INT PRIMARY KEY , confirmedCount INT , confirmedIncr INT, curedCount INT, curedIncr INT , currentConfirmedCount INT , currentConfirmedIncr INT , dateId INT , deadCount INT, deadIncr INT, suspectedCount INT, suspectedCountIncr INT )
進入資料庫後,執行這個檔案:source E:\MySQL\mysql-8.0.25-winx64\wpzy.sql
查看錶結構:show full columns from china_provincedata;
準備就緒,接下來進行第三步:將json寫入資料庫中
# 將json資料寫入資料庫 import json import pymysql import pandas as pd nameMap = {'模里西斯':'Mauritius','聖皮埃爾和密克隆群島':'St. Pierre and Miquelon','安圭拉':'Anguilla','荷蘭加勒比地區':'Caribbean Netherlands','聖巴泰勒米島':'Saint Barthelemy','英屬維爾京群島':'British Virgin Is.','葛摩':'Comoros','蒙特塞拉特':'Montserrat','塞席爾':'Seychelles','特克斯和凱科斯群島':'Turks and Caicos Is.','梵蒂岡':'Vatican','聖其茨和尼維斯':'Saint Kitts and Nevis','庫拉索島':'Curaçao','多米尼克':'Dominica','聖文森及格瑞那丁':'St. Vin. and Gren.','斐濟':'Fiji','聖露西亞':'Saint Lucia','北馬裡亞納群島聯邦':'N. Mariana Is.','格林那達':'Grenada','安地卡及巴布達':'Antigua and Barb.','列支敦斯登':'Liechtenstein','聖馬丁島':'Saint Martin','法屬波利尼西亞':'Fr. Polynesia','美屬維爾京群島':'U.S. Virgin Is.','荷屬聖馬丁':'Sint Maarten','巴貝多':'Barbados','開曼群島':'Cayman Is.','摩納哥':'Monaco','阿魯巴':'Aruba','千里達及托巴哥':'Trinidad and Tobago','鑽石公主號郵輪':'Princess','瓜德羅普島':'Guadeloupe','關島':'Guam','直布羅陀':'Gibraltar','馬提尼克':'Martinique','馬耳他':'Malta','法羅群島':'Faeroe Is.','聖多美和普林西比':'São Tomé and Principe','安道爾':'Andorra','根西島':'Guernsey','澤西島':'Jersey','維德角':'Cape Verde','馬恩島':'Isle of Man','留尼旺':'Reunion','聖馬利諾':'San Marino','馬爾地夫':'Maldives','馬約特':'Mayotte','巴林':'Bahrain','新加坡': 'Singapore Rep.', '多明尼加': 'Dominican Rep.', '巴勒斯坦': 'Palestine', '巴哈馬': 'The Bahamas', '東帝汶': 'East Timor', '阿富汗': 'Afghanistan', '幾內亞比索': 'Guinea Bissau', '象牙海岸': "Côte d'Ivoire", '錫亞琴冰川': 'Siachen Glacier', '英屬印度洋領土': 'Br. Indian Ocean Ter.', '安哥拉': 'Angola', '阿爾巴尼亞': 'Albania', '阿聯酋': 'United Arab Emirates', '阿根廷': 'Argentina', '亞美尼亞': 'Armenia', '法屬南半球和南極領地': 'French Southern and Antarctic Lands', '澳大利亞': 'Australia', '奧地利': 'Austria', '亞塞拜然': 'Azerbaijan', '蒲隆地共和國': 'Burundi', '比利時': 'Belgium', '貝南': 'Benin', '布吉納法索': 'Burkina Faso', '孟加拉國': 'Bangladesh', '保加利亞': 'Bulgaria', '波黑': 'Bosnia and Herz.', '白俄羅斯': 'Belarus', '貝里斯': 'Belize', '百慕大': 'Bermuda', '玻利維亞': 'Bolivia', '巴西': 'Brazil', '汶萊': 'Brunei', '不丹': 'Bhutan', '波札那': 'Botswana', '中非共和國': 'Central African Rep.', '加拿大': 'Canada', '瑞士': 'Switzerland', '智利': 'Chile', '中國': 'China', '象牙海岸': 'Ivory Coast', '喀麥隆': 'Cameroon', '剛果(金)': 'Dem. Rep. Congo', '剛果(布)': 'Congo', '哥倫比亞': 'Colombia', '哥斯大黎加': 'Costa Rica', '古巴': 'Cuba', '北塞普勒斯': 'N. Cyprus', '塞普勒斯': 'Cyprus', '捷克': 'Czech Rep.', '德國': 'Germany', '吉布提': 'Djibouti', '丹麥': 'Denmark', '阿爾及利亞': 'Algeria', '厄瓜多': 'Ecuador', '埃及': 'Egypt', '厄利垂亞': 'Eritrea', '西班牙': 'Spain', '愛沙尼亞': 'Estonia', '衣索比亞': 'Ethiopia', '芬蘭': 'Finland', '斐': 'Fiji', '福克蘭群島': 'Falkland Islands', '法國': 'France', '加彭': 'Gabon', '英國': 'United Kingdom', '喬治亞': 'Georgia', '迦納': 'Ghana', '幾內亞': 'Guinea', '甘比亞': 'Gambia', '赤道幾內亞': 'Eq. Guinea', '希臘': 'Greece', '格陵蘭': 'Greenland', '瓜地馬拉': 'Guatemala', '法屬蓋亞那': 'French Guiana', '蓋亞那': 'Guyana', '宏都拉斯': 'Honduras', '克羅埃西亞': 'Croatia', '海地': 'Haiti', '匈牙利': 'Hungary', '印度尼西亞': 'Indonesia', '印度': 'India', '愛爾蘭': 'Ireland', '伊朗': 'Iran', '伊拉克': 'Iraq', '冰島': 'Iceland', '以色列': 'Israel', '義大利': 'Italy', '牙買加': 'Jamaica', '約旦': 'Jordan', '日本': 'Japan', '哈薩克': 'Kazakhstan', '肯亞': 'Kenya', '吉爾吉斯斯坦': 'Kyrgyzstan', '柬埔寨': 'Cambodia', '韓國': 'Korea', '科索沃': 'Kosovo', '科威特': 'Kuwait', '寮國': 'Lao PDR', '黎巴嫩': 'Lebanon', '賴比瑞亞': 'Liberia', '利比亞': 'Libya', '斯里蘭卡': 'Sri Lanka', '賴索托': 'Lesotho', '立陶宛': 'Lithuania', '盧森堡': 'Luxembourg', '拉脫維亞': 'Latvia', '摩洛哥': 'Morocco', '摩爾多瓦': 'Moldova', '馬達加斯加': 'Madagascar', '墨西哥': 'Mexico', '北馬其頓': 'Macedonia', '馬裡': 'Mali', '緬甸': 'Myanmar', '黑山': 'Montenegro', '蒙古': 'Mongolia', '莫三比克': 'Mozambique', '茅利塔尼亞': 'Mauritania', '馬拉維': 'Malawi', '馬來西亞': 'Malaysia', '奈米比亞': 'Namibia', '新喀里多尼亞': 'New Caledonia', '尼日': 'Niger', '奈及利亞': 'Nigeria', '尼加拉瓜': 'Nicaragua', '荷蘭': 'Netherlands', '挪威': 'Norway', '尼泊爾': 'Nepal', '紐西蘭': 'New Zealand', '阿曼': 'Oman', '巴基斯坦': 'Pakistan', '巴拿馬': 'Panama', '祕魯': 'Peru', '菲律賓': 'Philippines', '巴布亞紐幾內亞': 'Papua New Guinea', '波蘭': 'Poland', '波多黎各': 'Puerto Rico', '朝鮮': 'Dem. Rep. Korea', '葡萄牙': 'Portugal', '巴拉圭': 'Paraguay', '卡達': 'Qatar', '羅馬尼亞': 'Romania', '俄羅斯': 'Russia', '盧安達': 'Rwanda', '西撒哈拉': 'W. Sahara', '沙烏地阿拉伯': 'Saudi Arabia', '蘇丹': 'Sudan', '南蘇丹': 'S. Sudan', '塞內加爾': 'Senegal', '索羅門群島': 'Solomon Is.', '獅子山': 'Sierra Leone', '薩爾瓦多': 'El Salvador', '索馬利亞蘭': 'Somaliland', '索馬利亞': 'Somalia', '塞爾維亞': 'Serbia', '蘇利南': 'Suriname', '斯洛伐克': 'Slovakia', '斯洛維尼亞': 'Slovenia', '瑞典': 'Sweden', '史瓦濟蘭': 'Swaziland', '敘利亞': 'Syria', '查德': 'Chad', '多哥': 'Togo', '泰國': 'Thailand', '塔吉克': 'Tajikistan', '土庫曼': 'Turkmenistan', '特里尼達和多巴哥': 'Trinidad and Tobago', '突尼西亞': 'Tunisia', '土耳其': 'Turkey', '坦尚尼亞': 'Tanzania', '烏干達': 'Uganda', '烏克蘭': 'Ukraine', '烏拉圭': 'Uruguay', '美國': 'United States', '烏茲別克': 'Uzbekistan', '委內瑞拉': 'Venezuela', '越南': 'Vietnam', '萬那杜': 'Vanuatu', '西岸': 'West Bank', '葉門共和國': 'Yemen', '南非': 'South Africa', '尚比亞共和國': 'Zambia', '辛巴威': 'Zimbabwe'} # 將各國json資料寫入資料庫 def importWorldJsonToDB(): # 建立資料庫連線 db = pymysql.connect( host="127.0.0.1", user="root", password="123456", database="test_db" ) # 使用cursor()方法建立一個遊標物件cursor cursor=db.cursor() deleteSql="truncate countrydata" #每次都刪除全部資料重新新增 try: cursor.execute(deleteSql) db.commit() print("刪除國家資料成功!進行重新匯入!") except: print("刪除國家資料時出錯!") db.rollback() with open("E:/Install/python3.9/data/worldData.json",'r') as f: worldDataJson=json.load(f) # 批量插入的資料集合 insertValue=[] # 所插入的主鍵記錄 dataCount=1 for i in range(0, len(worldDataJson)): # 獲取每一個國家的名稱,並開啟其對應的json檔案 countryName=worldDataJson[i]['provinceName'] countryShortCode=worldDataJson[i]['countryShortCode'] continent=worldDataJson[i]['continents'] countryFullName=nameMap[worldDataJson[i]['provinceName']] countryJsonPath="E:/Install/python3.9/data/worldData/"+countryName+".json" with open(countryJsonPath) as f: countryJson=json.load(f) for j in range(0,len(countryJson['data'])): tupleData=() tupleData+=( dataCount,countryJson['data'][j]['confirmedCount'],countryJson['data'][j]['confirmedIncr'], countryJson['data'][j]['curedCount'],countryJson['data'][j]['curedIncr'],countryJson['data'][j]['currentConfirmedCount'], countryJson['data'][j]['currentConfirmedIncr'],countryJson['data'][j]['dateId'],countryJson['data'][j]['deadCount'], countryJson['data'][j]['deadIncr'],countryJson['data'][j]['suspectedCount'],countryJson['data'][j]['suspectedCountIncr'], countryName,countryShortCode,continent,countryFullName ) insertValue.append(tupleData) dataCount+=1 insertSql="INSERT INTO countrydata (id,confirmedCount,confirmedIncr,curedCount,curedIncr,currentConfirmedCount,currentConfirmedIncr,dateId,deadCount,deadIncr,suspectedCount,suspectedCountIncr,countryName,countryShortCode,continent,countryFullName) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" # 執行資料插入 try: cursor.executemany(insertSql,insertValue) db.commit() print("插入國家資料成功!") except: print("插入國家資料失敗!") db.rollback() # 關閉連線 cursor.close() db.close() # 將各省資料json資料寫入資料庫 def importProvinceJsonToDB(): # 建立資料庫連線 db=pymysql.connect( host="127.0.0.1", user="root", password="123456", database="test_db" ) # 使用cursor()方法建立一個遊標物件cursor cursor=db.cursor() #每次都刪除全部資料重新新增 deleteSql="truncate china_provincedata" try: cursor.execute(deleteSql) db.commit() print("刪除省份資料成功!進行重新匯入!") except: print("刪除省份資料時出錯!") db.rollback() with open("E:/Install/python3.9/data/provinceData.json",'r') as f: provinceDataJson=json.load(f) #批量插入的資料集合 insertValue=[] # 所插入的主鍵記錄 dataCount=1 for i in range(0,len(provinceDataJson)): # 獲取每一個省份的名稱,並開啟其對應的json檔案 provinceName=provinceDataJson[i]['provinceName'] provinceShortName=provinceDataJson[i]['provinceShortName'] provinceJsonPath="E:/Install/python3.9/data/provinceData/"+provinceName+".json" with open(provinceJsonPath) as f: provinceJson=json.load(f) for j in range(0,len(provinceJson['data'])): tupleData=() tupleData+=( dataCount,provinceJson['data'][j]['confirmedCount'],provinceJson['data'][j]['confirmedIncr'],provinceJson['data'][j]['curedCount'],provinceJson['data'][j]['curedIncr'],provinceJson['data'][j]['currentConfirmedCount'],provinceJson['data'][j]['currentConfirmedIncr'],provinceJson['data'][j]['dateId'],provinceJson['data'][j]['deadCount'],provinceJson['data'][j]['deadIncr'],provinceJson['data'][j]['suspectedCount'],provinceJson['data'][j]['suspectedCountIncr'],provinceName,provinceShortName) insertValue.append(tupleData) dataCount+=1 insertSql="INSERT INTO china_provincedata(id,confirmedCount,confirmedIncr,curedCount,curedIncr,currentConfirmedCount,currentConfirmedIncr,dateId,deadCount,deadIncr,suspectedCount,suspectedCountIncr,provinceName,provinceShortName) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" # 執行資料插入 try: cursor.executemany(insertSql,insertValue) db.commit() print("插入省份資料成功!") except: print("插入省份資料失敗!") db.rollback() # 關閉連線 cursor.close() db.close() # 反轉名字字典 def inverse(): print("hello") print(dict([(v,k) for (k,v) in nameMap.items()])) def importWorldConToDB(): # 建立資料庫連線 db = pymysql.connect( host="127.0.0.1", user="root", password="123456", database="test_db" ) # 使用cursor()方法建立一個遊標物件cursor cursor = db.cursor() deleteSql = "truncate world_total_data" try: cursor.execute(deleteSql) db.commit() print("刪除世界資料成功!進行重新匯入!") except: print("刪除世界資料時出錯!") db.rollback() searchSql="select sum(confirmedCount),sum(confirmedIncr),sum(curedCount),sum(curedIncr),sum(currentConfirmedCount),sum(currentConfirmedIncr),dateId,sum(deadCount),sum(deadIncr),sum(suspectedCount),sum(suspectedCountIncr) from countrydata group by dateId order by dateId" cursor.execute(searchSql) searchList=cursor.fetchall() dataList=[] i=1 for data in searchList: temp=() temp+=(i,int(data[0]),int(data[1]),int(data[2]),int(data[3]),int(data[4]),int(data[5]),int(data[6]),int(data[7]),int(data[8]),int(data[9]),int(data[10])) dataList.append(temp) i+=1 # 開始插入資料 insertSql="INSERT INTO world_total_data (id,confirmedCount,confirmedIncr,curedCount,curedIncr,currentConfirmedCount,currentConfirmedIncr,dateId,deadCount,deadIncr,suspectedCount,suspectedCountIncr) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" # 執行資料插入 try: cursor.executemany(insertSql, dataList) db.commit() print("插入世界總體資料成功!") except: print("插入世界總體資料失敗!") db.rollback() # 關閉連線 cursor.close() db.close() importWorldJsonToDB() importProvinceJsonToDB() importWorldConToDB()
匯入報錯,檢查發現是資料庫中表的資料欄位打錯了。。。。修改重來!
匯入資料庫成功~
接下來將資料庫檔案匯出到excel表格:
select * from china_provincedata into outfile 'E:/MySQL/mysql-8.0.25-winx64/china_provincedata.xlsx'; select * from countrydata into outfile 'E:/MySQL/mysql-8.0.25-winx64/countrydata.xlsx'; select * from world_total_data into outfile 'E:/MySQL/mysql-8.0.25-winx64/world_total_data.xlsx';
獲得檔案:
內容:
資料分析
我們取湖北省疫情最嚴重的一段時間:20200120-20200520期間的當天當前確診人數,新建一個csv,將其製成折線圖:
import numpy as np import matplotlib.pyplot as plt import csv import pandas as pd data = pd.read_csv('湖北省20200120-20200520.csv',encoding='gbk') plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['font.family']='sans-serif' plt.rcParams['axes.unicode_minus'] = False fig=plt.figure(figsize=(15,10)) xdata=[] ydata=[] xdata=data.iloc[:,1] ydata=data.iloc[:,0] plt.xticks([]) plt.plot(xdata,ydata) plt.xlabel('時間') plt.ylabel('當前確診人數') plt.title('湖北省20200120-20200520疫情走勢') plt.show()
從圖中可以看出,疫情在湖北迅速爆發,但是在國家的管控下,得到了很好的遏制,感染人數在百天時間裡快速降低直至清零。
總結
今天,疫情在國內已經基本得到了控制,而國外諸多國家依舊疫情肆虐。這次學習讓我更加直觀的看到,疫情在國內的發展趨勢,這得益於國家的領導以及全國人民的努力和奉獻。
完成此次設計,我學到了非常非常多東西,查閱了很多資料,也產生了解決不完的各種疑問和錯誤。。。這次的實踐,我也發現了自己許多不足,對資料視覺化的不熟練、英語程度不夠用、程式碼細節處理不好、甚至某些基礎掌握都不夠牢靠...
紙上得來終覺淺,絕知此事要躬行。只有經過實踐,才能將課堂上學習到的知識實實在在的掌握,更能在實踐中學到一些課堂上沒有的東西,不斷進步,觸類旁通。