使用python做一个全球疫情数据采集+采用Excel存储+采用词云图展示

前期准备工作

需要了解基本的python语法知识,可以参考我的另一篇文章,对python基础知识的总结,或者参考缪雪峰老师的python课程,是免费的。

我们先来了解一下爬虫

网络爬虫与浏览器的区别

浏览器是展示数据的,而网络爬虫是采集数据的

什么是网络爬虫

模拟客户端发送网络请求,获取响应数据,一种按照一定的规则,自动地抓取万维网信息的程序和脚本

网络爬虫的作用

从互联网上采集我们所需要的数据

本程序需要使用到的几个库:

1.Requests请求库

作用:Python HTTP请求库,发送请求,获取响应数据

  1. 导入模块
  2. 发送get请求,获取响应
  3. 从响应中获取数据

text 获取响应的字符串

encoding 二进制转换成字符时使用的方式

content  响应体bytes类型数据

安装:pip install requests

简单示例

#导入模块
import requests
#1.爬取百度的疫情数据网页
#目标url
url = "https://voice.baidu.com/act/newpneumonia/newpneumonia"
#发出get请求
response = requests.get(url)
#打印响应内容
print(response.content.decode())

2.模块lxml

作用:实现解析HTML、XML文档

数据提取:在发送请求获取响应后,可能存在多种不同类型的响应内容,我们只需要有用的部分

lxml是一款高性能的python HTML、XML解析器

XPath是一门在HTML、XML文档中查找信息的语言,可用在HTML、XML对元素和属性进行遍历

常用的几种使用方式

/从根节点选取

//从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置

.选取当前节点

@选取属性

text()选择文本

*匹配任何元素节点

安装:pip install lxml

例如

//script[@lang=”eng”] 选取所有tltle元素,且这些元素拥有值为eng的lang属性

简单示例

#导入lxml的etree库(使用XPath)

from lxml import etree

#利用etree.HTML将字符串转化为Element对象,其具有xpath方法,返回的结果列表能够接收bytes类型的数据和str类型的数据

html = etree.HTML(text)

result = html.xpath('//*[@id="captain-config"]/text()')

ret_list = html.xpath(“xpath字符串“)

3.openpyxl库:实现Excel文件操作

安装:pip install openpyxl

创建表的简单示例

#导入模块
from openpyxl import workbook
#新建文件,同时新建一张工作表(worksheet)
wb = workbook()
#获取正在运行的工作表
ws = wb.active
#在创建工作表时自动重命名。按照顺序依次命名为(sheet,sheet1,sheet2)
#可以通过调用下面属性修改工作表名称
ws.title = "new title"
#通过索引增加数据
ws["A1"] = "姓名"
ws["B1"] = "年龄"
ws["A2"] = "职业"
ws["B2"] = "生日"
#使用append()方法插入数据行
#ws.append(["黎明","18","学生","2000-5-25"])
#使用save()保存工作薄文件
wb.save("信息资料.xlsx")

读取表的简单示例

#读取一个已存在的文件
workbook2 = load_workbook("信息资料.xlsx")
#获取所有sheet表名
print(workbook2.sheetnames)
#指定sheet表
ws = workbook2["new title"]
#获取指定单元格对象,取出的不是真实数据
cell=ws["A3"]
#通过此方法取出真实数据
print(cell.value)
#通过遍历获取所有数据,他会把每一行当作一个数据,ws.values存了所有元组
for x in ws.values:
    print(x)

4.wordcloud: 实现词云图生成

安装:pip install wordcloud

简单示例

#wordcloud的使用实例
#导入模块
from wordcloud import WordCloud
#从给定的text中按空格读取单词,出现次数越多的单纯,在生成的图像越大
text = "dag cat fish bird cat cat dog dog dog"
#创建词云图像,需要进行配置默认黑色背景,200*400
wc = WordCloud()
#根据词频生成词云图
wc.generate(text)
#保存
wc.to_file("1.png")

下面进入正题

程序实现的思路

第一步:导入需要使用的模块

#导入模块
import requests
import json
from lxml import etree
from openpyxl import Workbook
from tqdm import tqdm

第二步:使用requests库发送请求,获取数据

#1.获取百度的疫情数据网页
#目标url
url = "https://voice.baidu.com/act/newpneumonia/newpneumonia"
#发出get请求
response  = requests.get(url)
#打印响应内容
#print(response.content.decode())

第三步:获取数据内容,这里需要使用lxml模块,调用etree.HTML创建一个html对象,再使用xpath语法获取我们需要的数据。



#2.解析获取到的内容,获得疫情数据
#根据获取的内容,创建一个html对象
html = etree.HTML(response.content.decode())
#使用xpath语法获取各国疫情数据
result1 = html.xpath('//*[@id="captain-config"]/text()')
#使用xpath语法获取各洲疫情数据
result2 = html.xpath('//*[@id="captain-config"]/text()')

通过浏览器自带的网站开发工具我们得知,所需要的数据都放在id=captain-config的script标签下,因为利用etree.HTML将字符串转化为Element对象,其具有xpath方法,返回的结果列表能够接收bytes类型的数据和str类型的数据。由此我们可以使用  html.xpath('//*[@id="captain-config"]/text()')来获取id=captain-config标签下的text形式的数据。

第四步:由于第三步获取的数据并不是真正的“字典数据”,而是json类型的字符串数据,所以在此我们需要用到python自带的json模块,调用json.loads,把数据转化为python类型数据

#result[0]不是真正的字典类型
#通过json.loads将json字符串转为字典
result1 = json.loads(result1[0])
result2 = json.loads(result2[0])

这里需要说明:在我们使用 json.loads(result[0])获取的数据才转化为python的字典类型,之前是json类型的字符串,是使用的双引号,现在是单引号。使用[0]是因为,result是一个大的字典,我们需要的数据在第一个字典的元素里。

第五步:通过以获取到的数据,进一步通过网站的标签,获取到全球各国的疫情数据

经过研究和测试,能够推断出我们需要的全球疫情数据在键为component中,由上图知道component对应的值又是一个字典,取完component后,又是一个列表,我们需要再取第0个元素,由已知条件,我们能够推断出,键为caseOutsideList是全球各国疫情数据,键:globalList为各大洲的疫情数据

通过for循环,即可获取到各国数据,和各大洲疫情数据

第六步:调用openpyxl库,创建Excel表格,通过对第五步以获取到的全球疫情数据,以及各大洲疫情数据,进行遍历写进两个Excel表格

#3.将数据保存到excel
#创建工作表
wb = Workbook()
ws = wb.active
ws.title = "国际疫情数据"

#填写表的列名
ws.append(["国家","累计确诊","死亡","治愈","现有确诊",
           "累计确诊增量","死亡增量","治愈的增量","现有确诊增量"])

#循环遍历数据,按照顺序,将数据加入到excel中
for each in tqdm(result1,"采集各国疫情数据到Excel进度"):
    temp_list = [each['area'],each['confirmed'],each['died'],
                 each['crued'],each['curConfirm'],
                 each['confirmedRelative'],each['diedRelative'],
                 each['curedRelative'],each['curConfirmRelative']]
    for i in range(len(temp_list)):
        if temp_list[i] == '':
            temp_list[i] = '0'
    ws.append(temp_list)

#保存文件

#3.将数据保存到excel
#创建工作表
wb = Workbook()
ws = wb.active
ws.title = "各大洲疫情数据"

#填写表的列名
ws.append(["洲名","现有确诊","累计确诊","累计治愈","累计死亡","累计确诊增量"])
#循环遍历数据,按照顺序,将数据加入到excel中
for each in tqdm(result2,"采集各洲疫情数据到Excel进度"):
    temp_list = [each['area'],each['curConfirm'],each['confirmed'],
                 each['crued'],each['died'],each['confirmedRelative']]
    for i in range(len(temp_list)):
        if temp_list[i] == '':
            temp_list[i] = '0'
    ws.append(temp_list)
#保存文件

这里需要提醒的是,我们不是所有的数据都需要,而是截取了"国家","累计确诊","死亡","治愈","现有确诊","累计确诊增量","死亡增量","治愈的增量","现有确诊增量" 即对应的

'area'、'confirmed'、'died'、'crued'、'curConfirm'、'confirmedRelative'、'diedRelative'、'curedRelative'、'curConfirmRelative'

"洲名","现有确诊","累计确诊","累计治愈","累计死亡","累计确诊增量"即对应的

'area'、'confirmed'、'died'、'crued'、'curConfirm'、'confirmedRelative'、'diedRelative'、'curedRelative'、'curConfirmRelative'

通过遍历以获取的数据,组成一个新的列表。还通过for循环来判断数据是否为空,为空就补0

调用tqdm是为了添加进度条,使得程序运行过程更加直观,记得在最前面添加tqdm库

第七步:保存文件

#保存文件全球疫情数据
wb.save("C:/Users/80817/Desktop/疫情数据统计/Excel/global_covid_data.xlsx")
#保存文件各大洲疫情数据
wb.save("C:/Users/80817/Desktop/疫情数据统计/Excel/zhou_covid_data.xlsx")

第八步:通过调用openpyxl库读取,第七步保存的文件,获取疫情数据。同时,调用wordcloud库,在此,我们需要先创建一个空的字典,我们需要用wc.generate_from_frequencies()此方法(只需要传入一个字典{词:词频})它将会根据词频来自动生成图片,我们需要通过循环遍历文件,只需要获取{国家名称:累计确诊人数},{国家名称:累计死亡人数},{国家名称:现有确诊人数},{国家名称:累计治愈人数}传入到字典,再通过上述方法,完成创建出需要的词云图。

#导入模块
from openpyxl import load_workbook
from wordcloud import WordCloud
from tqdm import tqdm

#1.读取已保存的excel文件
wb = load_workbook("C:/Users/80817/Desktop/疫情数据统计/Excel/global_covid_data.xlsx")
ws = wb["国际疫情数据"]

#生成词云图需要一个字典格式,生成一个字典{词:频率} ,{省份:累计确诊数},词频是数字类型用int强转
#1.遍历国家累计确诊量
frequencie = {}
for row in tqdm(ws.values,"遍历各国累计确诊量"):
    if row[0] != "国家":
        #row[0]是key,row[1]是值
        frequencie[row[0]] = int(row[1])

#2.遍历国家累计死亡量
frequencie1 = {}
for row in tqdm(ws.values,"遍历各国累计死亡量"):
    if row[0] != "国家":
        #row[0]是key,row[1]是值
        frequencie1[row[0]] = int(row[2])

#3.遍历国家累计死亡量
frequencie2= {}
for row in tqdm(ws.values,"遍历各国现有确诊量"):
    if row[0] != "国家":
        #row[0]是key,row[1]是值
        frequencie2[row[0]] = int(row[4])

#3.遍历国家累计治愈量
frequencie3= {}
for row in tqdm(ws.values,"遍历各国现有确诊量"):
    if row[0] != "国家":
        #row[0]是key,row[1]是值
        frequencie3[row[0]] = int(row[3])
#print(frequencie1)

#2.生成词云图
#自定义字体,宽高,颜色
wc = WordCloud(font_path="msyh.ttc",width=800,height=480,background_color="snow")
wc.generate_from_frequencies(frequencie)
wc.to_file("C:/Users/80817/Desktop/疫情数据统计/wordcloud/各国累计确诊量统计.png")
wc.generate_from_frequencies(frequencie1)
wc.to_file("C:/Users/80817/Desktop/疫情数据统计/wordcloud/各国累计死亡量统计.png")
wc.generate_from_frequencies(frequencie2)
wc.to_file("C:/Users/80817/Desktop/疫情数据统计/wordcloud/各国现有确诊统计.png")
wc.generate_from_frequencies(frequencie3)
wc.to_file("C:/Users/80817/Desktop/疫情数据统计/wordcloud/各国累计治愈量.png")

到此,通过python爬取疫情数据(全球疫情)的全过程就是这么多啦,爬取国内疫情数据,原理差不多。

项目效果

获取疫情数据

 

以下是获取到的疫情数据Excel表格

 

通过Excel生成词云图

 生成词云图

 

显示云词图效果

 

才疏学浅,有写错的地方忘大佬多多指教

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w辣条小王子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值