许多人在疫情期间有了对疫情数据进行爬取以及分析的需求,借助技术手段去获取还有可视化这些数据,不但能够辅助我们领会疫情的发展状况,而且还能提升数据分析能力。本文要探究的关键在于怎样从毫无基础开始达成这一流程,并且使它成为能够被使用的数据集。
数据爬取的基本思路
要得到网络里的公开疫情数据,一般得靠运用编程语言来编写爬虫程序。Python是常用工具,借助requests库去发送网络请求,能够获取到网页的原始内容。数据常常以JSON或者HTML格式在网页里存在,得认真剖析网页结构才可精确找到其位置。
import json
import requests
import pandas as pd
from bs4 import BeautifulSoup
url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia?from=timeline&isappinstalled=0'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
response = requests.get(url,headers = headers)
response.encoding = 'utf-8'
content = response.content.decode('utf-8')#以字节流形式打印网页源码
soup = BeautifulSoup(response.text,'lxml')
#爬取选择网页文档的内容
data = soup.find_all(name = 'script',attrs = {'id':'getListByCountryTypeService2true'})
#转为字符串
account = str(data)
account1 = account[95:-21]#切片截取从52到后面倒数21取到需要的数据
account1_json = json.loads(account1)
#提取数据到列表
id = []
continents = []
provinceName = []
currentConfirmedCount = []
confirmedCount = []
confirmedCountRank = []
suspectedCount = []
curedCount = []
deadCount = []
deadCountRank = []
deadRate = []
deadRateRank = []
print(len(account1_json))
i=0
for a in account1_json:
if 'id' in a:
id.append(a['id'])
else:
id.append('没有')
continents.append(a['continents'])
provinceName.append(a['provinceName'])
currentConfirmedCount.append(a['currentConfirmedCount'])
confirmedCount.append(a['confirmedCount'])
if 'confirmedCountRank' in a:
confirmedCountRank.append(a['confirmedCountRank'])
else:
confirmedCountRank.append('没有')
suspectedCount.append(a['suspectedCount'])
curedCount.append(a['curedCount'])
deadCount.append(a['deadCount'])
if 'deadCountRank' in a:
deadCountRank.append(a['deadCountRank'])
else:
deadCountRank.append('没有')
if 'deadRate' in a:
deadRate.append(a['deadRate'])
else:
deadRate.append('没有')
if 'deadRateRank' in a:
deadRateRank.append(a['deadRateRank'])
else:
deadRateRank.append('没有')
#转换成pandas数组
df = {
'id':pd.Series(id),
'所在大洲':pd.Series(continents),
'城市':pd.Series(provinceName),
'当前确诊':pd.Series(currentConfirmedCount),
'累计确诊':pd.Series(confirmedCount),
'确诊排名':pd.Series(confirmedCountRank),
'疑似病例':pd.Series(suspectedCount),
'治愈人数':pd.Series(curedCount),
'死亡人数':pd.Series(deadCount),
'死亡人数排名':pd.Series(deadCountRank),
'死亡率':pd.Series(deadRate),
'死亡率排名':pd.Series(deadRateRank)
}
pds = pd.DataFrame(df)
pds.to_excel('1.xlsx', index=False)
当代码成功将数据抓取到手之后,紧接着跟随着数据清洗以及整理的步骤。原始数据常常包含好多不需要的信息,或者格式并非统一,必然得经过处理才能够用于分析。这个阶段需要具备耐心与细心,确保最终得到的数据的准确性以及可用性。
世界疫情数据的获取与处理
若是着眼于全球疫情数据,能够寻觅那提供全球统计的具备权威性的网站当作数据源。在编写代码之际,务必要模拟浏览器的行为,设定合理的请求头以及时间间隔,以此来防止被目标网站所屏蔽。而成功获取到的数据一般是那种嵌套着的字典或者列表的结构。
关键的一步是把抓取得来的原始数据转变为结构化的表格。这项操作使用pandas库来进行,它能够便利地把数据转化成DataFrame格式。之后会把处理好的数据保存成CSV或者Excel文件,用来便于长期存储以及后续调用。
import requests
import pandas as pd
from bs4 import BeautifulSoup
import re
url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia?from=timeline&isappinstalled=0'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
#省级正则表达式
provinceName_re = re.compile(r'"provinceName":"(.*?)",')
provinceShortName_re = re.compile(r'"provinceShortName":"(.*?)",')
currentConfirmedCount_re = re.compile(r'"currentConfirmedCount":(.*?),')
confirmedCount_re = re.compile(r'"confirmedCount":(.*?),')
suspectedCount_re = re.compile(r'"suspectedCount":(.*?),')
curedCount_re = re.compile(r'"curedCount":(.*?),')
deadCount_re = re.compile(r'"deadCount":(.*?),')
comment_re = re.compile(r'"comment":"(.*?)",')
locationId_re = re.compile(r'"locationId":(.*?),')
statisticsData_re = re.compile(r'"statisticsData":"(.*?)",')
cities_re = re.compile(r'"cities":\[\{(.*?)\}\]')
#市级正则表达式
cityName_re = re.compile(r'"cityName":"(.*?)",')
currentConfirmedCount_1_re = re.compile(r'"currentConfirmedCount":(.*?),')
confirmedCount_1_re = re.compile(r'"confirmedCount":(.*?),')
suspectedCount_1_re = re.compile(r'"suspectedCount":(.*?),')
curedCount_1_re = re.compile(r'"curedCount":(.*?),')
deadCount_1_re = re.compile(r'"deadCount":(.*?),')
locationId_1_re = re.compile(r'"locationId":(.*?)\},')
#爬虫爬取数据
datas = requests.get(url,headers = headers)
datas.encoding = 'utf-8'
soup = BeautifulSoup(datas.text,'lxml')
data = soup.find_all('script',{'id':'getAreaStat'})
data = str(data)
data_str = data[54:-23]
#替换字符串内容,避免重复查找
citiess = re.sub(cities_re,'8888',data_str)
#查找省级数据
provinceNames = re.findall(provinceName_re,citiess)
provinceShortNames = re.findall(provinceShortName_re,citiess)
currentConfirmedCounts = re.findall(currentConfirmedCount_re,citiess)
confirmedCounts = re.findall(confirmedCount_re,citiess)
suspectedCounts = re.findall(suspectedCount_re,citiess)
curedCounts = re.findall(curedCount_re,citiess)
deadCounts = re.findall(deadCount_re,citiess)
comments = re.findall(comment_re,citiess)
locationIds = re.findall(locationId_re,citiess)
statisticsDatas = re.findall(statisticsData_re,citiess)
#查找市级数据
citiess_str1 = re.findall(cities_re,data_str)
#将市级列表数据转为字符串,方便正则表达式查找
citiess_str = str(citiess_str1)
cityName = re.findall(cityName_re,citiess_str)
currentConfirmedCount_1 = re.findall(currentConfirmedCount_1_re,citiess_str)
confirmedCount_1 = re.findall(confirmedCount_1_re,citiess_str)
suspectedCount_1 = re.findall(suspectedCount_1_re,citiess_str)
curedCount_1 = re.findall(curedCount_1_re,citiess_str)
deadCount_1 = re.findall(deadCount_1_re,citiess_str)
# 省级数据转换为pandas数组
df = {
'地区代码':pd.Series(locationIds),
'省':pd.Series(provinceNames),
'省区短名':pd.Series(provinceShortNames),
'当前确诊':pd.Series(currentConfirmedCounts),
'累计确诊':pd.Series(confirmedCounts),
'疑似确诊':pd.Series(suspectedCounts),
'治愈人数':pd.Series(curedCounts),
'死亡人数':pd.Series(deadCounts),
'评论':pd.Series(comments),
'统计数据区':pd.Series(statisticsDatas),
}
pds = pd.DataFrame(df)
pds.to_excel('国内疫情统计表1.xlsx',index=True)
国内疫情数据的整理方法
国内疫情数据的源头或许跟全球数据存在差异,得去寻觅专门发布国内信息的平台。这些平台的数据构造也许更为繁杂,更新频次或许也更为频繁,所以爬虫代码要有更强的稳健性去应对各类意外状况。
数据被获取之后,除了运用pandas加以处理之外,还能够直接导入Excel去进行手动整理以及简单计算。在结合Tableau等可视化工具的情况下,可以迅速地将数字转变为直观的图表,例如每日新增趋势图或者各省份对比柱状图,以此让数据背后所蕴含的信息清晰明了。
数据可视化与报告呈现
单个的数据表格欠缺直观性,把数据予以可视化是绝对不能少的一个步骤。世界疫情所属数据能够借由热点地图去进行展现,依靠颜色的深浅程度直观呈现不同国家或者地区的严重态势。国内的数据能够运用折线图展现时间走向趋势,或者运用分级统计地图展示地域差别的情况。
想要形成完整的分析报告,能够考虑把图表跟分析文字整合至网页里。借助HTML以及CSS自行设计网页布局,可灵活操控排版还有样式,让报告看上去更具专业性。这种方式的不足之处在于对技术存在要求,并且不便于直接打印成為纸质文档。
数据集的整理与分享
经历一段时期的积攒跟更新,手头兴许已然积攒了颇具规模度数的数据集合。比如说,能够整理出一份自疫情起始直至2022年初的全球数据集聚,涵括每个国家的每日记载,数据数量可达十多万条。另外一份数据集合则能够细划分至中国各个省份乃至城市。
能够把这些数据集予以规范命名以及分类,以此方便他人去使用,像是划分成全球表、分省表以及分市表。不但能够提供Excel或者CSV格式,还可以供给生成数据库的SQL脚本。于合适的平台分享这些资源,会对更多有需求的研究者或者学生有所帮助。
技术实践的价值与局限
历经从进行数据爬取,直至完成报告生成的整个流程,属于一回完整的数据科学实践行动,这不但能使得你对网络爬虫、数据处理、可视化等一整套工具链变得熟悉起来,而且还能够培育从繁杂众多信息里提取核心结论的能力,这样的技能在当今这个以数据为驱动力量的时代是极为珍贵的。
然而,此过程存有挑战与局限,公开数据之准确性及时效性不全保证,技术方法需持续学习更新,此外,处理涉及公众健康数据时,须秉持严谨负责态度,确保数据使用合规,免致误导。
对于那些曾让你深刻铭记的、你曾试着去爬取以及剖析的数据,你是在哪些方面进行过这样的尝试呢?欢迎于评论区域去分享你所历经过的事情以及最终达成的成果,要是你感觉从本文获取到了收获,同样也请通过点赞予以支持。








