COVID-19疫情数据分析

新型冠状病毒感染的肺炎疫情爆发后,对人们的生活产生很大的影响。
现特对COVID-19疫情实时数据和历史数据进行爬取、分析、可视化展示。

设计框架

在这里插入图片描述

一、数据爬取

1.1 选择数据源:

选择网易的疫情实时动态播报平台作为数据源,地址:https://wp.m.163.com/163/page/news/virus_report/index.html?nw=1&anw=1
在这里插入图片描述

1.2 数据定位及抓取

导入相关库

import pandas as pd
import requests
import time
pd.set_option('max_rows',500) # 显示500行数据
# 设置请求头,伪装为浏览器
headers = {
   
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 Edg/86.0.622.69'
}

# 发送请求
url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-total' # 定义要访问的地址
r = requests.get(url,headers = headers) # 使用requests发起请求

# 查看请求状态
r.status_code

200

响应码为200,说明页面正常响应成功!

print(type(r.text))    #查看类型。 r.text——文本获取
print(len(r.text))    # 查看文本长度

返回后的内容是一个30万长度的字符串,因字符串格式不方便进行分析,并且在网页预览中发现数据为类似字典的json格式,所以这里将其转为json格式。

import json
data_json = json.loads(r.text)  # 按照json格式读取
data_json

data中存放着我们所需要的网页数据
在这里插入图片描述

data = data_json['data']  # data中存放着我们需要的数据
data.keys() # 查看数据键值
dict_keys(['chinaTotal', 'chinaDayList', 'lastUpdateTime', 'areaTree'])

数据中有四个键,每个键值含义不同
键值含义

1.3 实时数据爬取

1.3.1 自定义函数:get_data(提取数据),save_data(保存数据)
# 将提取数据的方法封装为函数
def get_data(data,info_list):
    info = pd.DataFrame(data)[info_list] # 基本信息
    
    today_data = pd.DataFrame([i['today'] for i in data ]) # 获取today的数据
    today_data.columns = ['today_'+i for i in today_data.columns] # 修改列名
    
    total_data = pd.DataFrame([i['total'] for i in data ]) # 获取total的数据
    total_data.columns = ['total_'+i for i in total_data.columns] # 修改列名
    
    return pd.concat([info,total_data,today_data],axis=1) # info、today和total横向合并最终得到汇总的数据
# 定义保存数据方法
def save_data(data,name): 
    file_name = name+'_'+time.strftime('%Y_%m_%d',time.localtime(time.time()))+'.csv'
    data.to_csv(file_name,index=None,encoding='utf_8_sig')
    print(file_name+' 保存成功!')
1.3.2 中国各省实时数据
data_province = data['areaTree'][2]['children'] # 取出中国各省的实时数据
today_province = get_data(data_province,['id','lastUpdateTime','name']) # 省略children,去除嵌套字典
save_data(today_province,'today_province')

在这里插入图片描述

1.3.3 世界各国实时数据
areaTree = data['areaTree'] # 取出areaTree
today_world = get_data(areaTree,['id','lastUpdateTime','name']) # 获取世界各国实时数据
save_data(today_world,'today_world')

在这里插入图片描述

1.4 历史数据爬取

1.4.1 中国历史数据
chinaDayList = data['chinaDayList'] # 取出chinaDayList
alltime_China = get_data(chinaDayList,['date','lastUpdateTime'])
save_data(alltime_China,'alltime_China')
1.4.2 中国各省历史数据

在爬取各省历史数据的过程中,发现参数aeraCode=420000,而这刚好和全国各省实时数据today_province中的id对应,即更改爬取的URL中的aeraCode参数就可爬取不同省市的历史数据。

# 将各省行政区号和各省名称按照字典形式对位
province_dict = {
   num:name for num,name in zip(today_province['id'],today_province['name'])}
start = time.time()

for province_id in province_dict: # 遍历各省编号
    
    try:
        # 按照省编号访问每个省的数据地址,并获取json数据
        url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode='+province_id
        r = requests.get(url, headers=headers)
        data_json = json.loads(r.text)
        
        # 提取各省数据,然后写入各省名称
        province_data = get_data(data_json['data']['list'],['date'])
        province_data['name'] = province_dict[province_id]
        
        # 合并数据
        if province_id == '420000':
            alltime_province = province_data
        else:
            alltime_province = pd.concat([alltime_province,province_data])
            
        print('-'*20,province_dict[province_id],'成功',
              province_data.shape,alltime_province.shape,
              ',累计耗时:',round(time.time()-start),'-'*20)
        
        # 设置延迟等待
        time.sleep(20)
        
    except:
        print('-'*20,province_dict[province_id],'wrong','-'*20)
-------------------- 湖北 成功 (396, 16) (396, 16) ,累计耗时: 1 --------------------
-------------------- 香港 成功 (396, 16) (792, 16) ,累计耗时: 21 --------------------
-------------------- 广东 成功 (394, 16) (1186, 16) ,累计耗时: 42 --------------------
-------------------- 上海 成功 (380, 16) (1566, 16) ,累计耗时: 63 --------------------
-------------------- 黑龙江 成功 (385, 16) (1951, 16) ,累计耗时: 83 --------------------
-------------------- 浙江 成功 (392, 16) (2343, 16) ,累计耗时: 103 --------------------
-------------------- 河北 成功 (387, 16) (2730, 16) ,累计耗时: 124 --------------------
-------------------- 河南 成功 (394, 16) (3124, 16) ,累计耗时: 144 --------------------
                                         ......
-------------------- 青海 成功 (396, 16) (12889, 16) ,累计耗时: 678 --------------------
-------------------- 西藏 成功 (395, 16) (13284, 16) ,累计耗时: 710 --------------------

爬取成功并保存

save_data(alltime_province
  • 18
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值