python爬虫:网易新冠疫情数据爬取(一)

疫情数据爬取

  • 1.选择数据源
  • 2.国内数据的爬取
  • 3.国外数据的爬取
  • 4.爬取数据的可视化分析(pyecharts)

对于网易疫情数据爬取代码的更新见
Gitee: https://gitee.com/li-yur/AllSpider/tree/master/COVID-19.
增加了对国内各省市数据的爬取

python爬虫:网易新冠疫情数据爬取(一)_第1张图片

1.选择数据源

以网易的疫情播报平台为例,因为它的数据内容非常丰富,不仅包括国内的数据还包括国外的数据,且作为大平台,公信度也比较高。因此我选择网易的疫情实时动态播报平台作为数据源,
其地址如下:网易疫情播报平台

首页如下
python爬虫:网易新冠疫情数据爬取(一)_第2张图片
在页面任意位置右键点击检查

进入Network标签下的XHR,按下“Ctrl+R”刷新即可
python爬虫:网易新冠疫情数据爬取(一)_第3张图片
先找到的位置,点击进入,然后可以找到 data的字段,这里面就存放着我们想要的国内的和国外疫情的数据源。
python爬虫:网易新冠疫情数据爬取(一)_第4张图片
接下来找到其地址,点击headers后进行查看,在url中?后边为参数,可以不要,因此我们需要请求的地址为:https://c.m.163.com/ug/api/wuhan/app/data/list-total ,

并且可以看到请求方法为get,同时查看自己浏览器的user-agent,使用requests请求时,设置user-agent伪装浏览器。
python爬虫:网易新冠疫情数据爬取(一)_第5张图片
再开始写代码之前最好是多翻看这里的数据,搞明白这里的数据结构,以便于后面代码的实现。

2.国内数据的爬取

完整代码如下

import json
import time
import os
import requests
import pandas as pd


def get_html(Url, header):
    try:
        r = requests.get(url=Url, headers=header)
        r.encoding = r.apparent_encoding
        status = r.status_code
        # 将原始数据类型转换为json类型,方便处理
        data_json = json.loads(r.text)
        print(status)
        return data_json
    except:
        print("爬取失败")


# 将提取34个省数据的方法封装为函数
def get_data(data, info_list):
    # 直接提取["id","name","lastUpdateTime"] 的数据
    info = pd.DataFrame(data)[info_list]

    # 获取today的数据
    today_data = pd.DataFrame([province["today"] for province in data])
    # 修改列名
    today_data.columns = ["today_" + i for i in today_data.columns]

    # 获取total的数据
    total_data = pd.DataFrame([province["total"] for province in data])
    # 修改列名
    total_data.columns = ["total_" + i for i in total_data.columns]

    return pd.concat([info, today_data, total_data], axis=1)


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")

    # 检查是否保存成功,并打印提示文本
    if os.path.exists(file_name):
        print(file_name + " 保存成功")
    else:
        print('保存失败')


if __name__ == "__main__":
    # 访问网易实时疫情播报平台网址
    url = "https://c.m.163.com/ug/api/wuhan/app/data/list-total"

    # 设置请求头,伪装为浏览器
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) \
        AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
    }

    """爬取中国各省的疫情数据"""
    # 1.获取数据(此时的数据未经处理)
    datas = get_html(url, headers)

    # 2.找到储存中国34省的数据所在
    data_province = datas["data"]["areaTree"][2]["children"]

    # 3.提取34个省数据
    all_data = get_data(data_province, ["id", "name", "lastUpdateTime"])

    # 4.持久化保存数据
    save_data(all_data, "today_province")

这是在Jupyter中一步步探索实现的截图:
这有助于我们一步步的了解数据源的结构,以便代码的封装书写。
python爬虫:网易新冠疫情数据爬取(一)_第6张图片

3.国外数据的爬取

只需在上面的代码末尾直接加上这段代码就可以了。

   """爬取世界各国的疫情数据"""
    world_data = datas["data"]["areaTree"]
    worlds_data = get_data(world_data, ["id", "name", "lastUpdateTime"])
    save_data(worlds_data, "today_worlds")

这时你可能就会蒙圈了,为什么呢?
python爬虫:网易新冠疫情数据爬取(一)_第7张图片
这是因为国外的数据是在
json数据data中的areaTree是列表格式,每个元素都是一个国家的实时数据,每个元素的children是各国家省份的数据,

而在areaTree键值对下,
areaTree —> 2 --> children 。就是我国各省的实时数据

如果你没有仔细查看网页里数据结构,name现在应该有所明白的吧!
现在你也还可以继续回到网页继续翻看存放数据源的结构。

这里便是我爬取储存的数据
在这里插入图片描述
数据展示部分
python爬虫:网易新冠疫情数据爬取(一)_第8张图片
python爬虫:网易新冠疫情数据爬取(一)_第9张图片

4.爬取数据的可视化分析(pyecharts)

pyecharts数据可视化:对爬取的新冠疫情数据进行可视化(二)

部分结果展示:

python爬虫:网易新冠疫情数据爬取(一)_第10张图片

你可能感兴趣的:(Python爬虫,python,可视化,数据可视化)