【个人记录】山东大学项目实训——疫情情况采集分析网

在这里插入图片描述

项目背景及意义

2020年春节突如其来的新冠疫情打乱了很多人的阵脚,网络上各类相关信息也让人目不暇接。各个国家各个地区之间的疫情状况比较这样的统计分析型信息往往由文字简单描述,不够直观。在这样的背景下,我们项目组希望能够做一个统一的疫情实况平台,可以根据需求展示想看地区的当日数据,也可以通过动态图或折线图之类的方式去横向纵向地比较在不同地区不同时间下的疫情状况变化,给用户一个直观方便的体验。
在这里插入图片描述

数据源的讨论

为了让我们软件的数据更加真实准确,一个好的数据源必不可少,为此我们分别去网上寻找了不同的数据源,并且对比了之间的优缺点,选择出一个比较好的提案。以下是我在网上搜寻找到的一些数据源,经过跟小组成员讨论比较,我们最终确定使用网易的数据源。

1. 丁香园疫情数据
丁香园的数据按天进行更新,也都是汇总类型数据,在需求上与以上我们想要做的展示数据基本是符合的,它的疫情数据可以直接页面右键显示源代码来进行分析爬取,非常方便快捷。它以时间流的方式进行更新,方便我们对其进行使用。
在这里插入图片描述
但它的数据主要为统计汇总型数据,要查找实时数据采用这类数据源很方便,但想要看之前某段时间内的数据的话,这类数据源就很难满足要求,因为它不会保留之前某天的具体新增数据,而是全部加在一起的累计数据,所以我们经过讨论之后放弃了该数据源。

2. 腾讯和网易官方维护的疫情数据

腾讯和网易可以说是国内比较靠谱的大企业了,他们两家的数据可以保证其可靠性,并且这两个数据源的获取方式很类似,数据源类型也几乎相同,所以放在一起说。它们的疫情数据是通过网页请求其他url,返回json格式的数据再根据用户需求渲染到网页上显示。检查开发者工具中的Network项可以得到,相对来说比较容易获取。
在这里插入图片描述
在这里插入图片描述

不过腾讯的数据源也需要处理一个用户登录操作,经过我们的试验,这个登录有时需要验证码,有时不需要,给我们项目的编写带来了困难。而网易是直接将数据源接口给出来的,不需要登录也不检验,使用起来相对方便,考虑到二者数据类型更新频率都相似,所以相较之下网易更好一些。

在这里插入图片描述

从零开始的爬虫之旅

在写这个项目之前,我对爬虫这个词仅仅停留在概念方面,因此在开始编写项目之前,我先自主学习了爬虫的相关知识。
在这里插入图片描述
在这里插入图片描述

Python环境的搭建

首先下载安装anaconda

这个是我的安装路径:D:\Anaconda我安装在了D盘下
在这里插入图片描述
打开anaconda,是这个界面:
在这里插入图片描述
接下来我根据教程创建了环境-project305,并且搭建了环境变量,这样一个环境就创建好了。
在这里插入图片描述
之后我还需要安装pychart,我按照教程一一进行。

1、官网下载安装包Pyecharts
2、将Pyecharts文件(也就是下载的pyecharts-0.5.11-py2.py3-none-any.whl文件)放到Anaconda3的pkgs目录下
3、打开Anaconda Prompt,输入cd anaconda3/pkgs进入文件夹
4、输入pip install pyecharts-0.5.11-py2.py3-none-any.whl即可安装成功

这里我遇到了一点困难,与教程不同,我的anaconda安装在d盘,我直接使用cd命令怎么也去不了d盘,通过网上搜索我得知,要依次退出目录,在根目录下进入d盘。
在这里插入图片描述
之后便安装成功!

在这里插入图片描述

爬虫代码部分

构建headers

headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}
url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-total'
r = requests.get(url , headers=headers)
data_json = json.loads(r.text)
data = data_json['data']

写了两个方法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 = './data/' + 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+' 保存成功!')

生成的csv文件格式如图所示
在这里插入图片描述
创建三份csv文件,分别保存省份数据,世界数据,中国数据

# 保存每日省份数据
data_province = data['areaTree'][2]['children']
today_province = get_data(data_province,['id','lastUpdateTime','name'])
save_data(today_province,'today_province')
# 保存每日世界数据
areaTree = data['areaTree'] # 取出areaTree
today_world = get_data(areaTree,['id','lastUpdateTime','name'])
save_data(today_world,'today_world')
# 保存中国每日的数据
chinaDayList = data['chinaDayList'] # 取出chinaDayList
alltime_China = get_data(chinaDayList,['date','lastUpdateTime'])
save_data(alltime_China,'alltime_China')

通过遍历每个国家的编号,获取不同国家的数据

#获得各个国家历史数据
country_dict = { key:value for key,value in zip(today_world['id'], today_world['name'])}
start = time.time()
for country_id in country_dict:  # 遍历每个国家的编号

    try:
        # 按照编号访问每个国家的数据地址,并获取json数据
        url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=' + country_id
        r = requests.get(url, headers=headers)
        json_data = json.loads(r.text)

        # 生成每个国家的数据
        country_data = get_data(json_data['data']['list'], ['date'])
        country_data['name'] = country_dict[country_id]

        # 数据叠加
        if country_id == '9577772':
            alltime_world = country_data
        else:
            alltime_world = pd.concat([alltime_world, country_data])

        print('-' * 20, country_dict[country_id], '成功', country_data.shape, alltime_world.shape,
              ',累计耗时:', round(time.time() - start), '-' * 20)

        time.sleep(10)

    except:
        print('-' * 20, country_dict[country_id], 'wrong', '-' * 20)
save_data(alltime_world,'alltime_world')

通过遍历每个省的编号,获取不同省份的数据

# 保存各省历史数据
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(10)

    except:
        print('-' * 20, province_dict[province_id], 'wrong', '-' * 20)
save_data(alltime_province,'alltime_province')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值