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


疫情数据爬取

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

对于网易疫情数据爬取代码的更新见
Gitee: https://gitee.com/li-yur/AllSpider/tree/master/COVID-19.
增加了对国内各省市数据的爬取
Python爬虫|python爬虫(网易新冠疫情数据爬取(一))
文章图片

1.选择数据源 以网易的疫情播报平台为例,因为它的数据内容非常丰富,不仅包括国内的数据还包括国外的数据,且作为大平台,公信度也比较高。因此我选择网易的疫情实时动态播报平台作为数据源,
其地址如下:网易疫情播报平台
首页如下
Python爬虫|python爬虫(网易新冠疫情数据爬取(一))
文章图片

在页面任意位置右键点击检查
进入Network标签下的XHR,按下“Ctrl+R”刷新即可
Python爬虫|python爬虫(网易新冠疫情数据爬取(一))
文章图片

先找到①的位置,点击进入,然后可以找到② data的字段,这里面就存放着我们想要的国内的和国外疫情的数据源。
Python爬虫|python爬虫(网易新冠疫情数据爬取(一))
文章图片

接下来找到其地址,点击headers后进行查看,在url中?后边为参数,可以不要,因此我们需要请求的地址为:https://c.m.163.com/ug/api/wuhan/app/data/list-total ,
并且可以看到请求方法为get,同时查看自己浏览器的user-agent,使用requests请求时,设置user-agent伪装浏览器。
Python爬虫|python爬虫(网易新冠疫情数据爬取(一))
文章图片

再开始写代码之前最好是多翻看这里的数据,搞明白这里的数据结构,以便于后面代码的实现。
2.国内数据的爬取 完整代码如下
import json import time import os import requests import pandas as pddef 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 = https://www.it610.com/article/pd.DataFrame([province["today"] for province in data]) # 修改列名 today_data.columns = ["today_" + i for i in today_data.columns]# 获取total的数据 total_data = https://www.it610.com/article/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 = https://www.it610.com/article/get_data(data_province, ["id", "name", "lastUpdateTime"])# 4.持久化保存数据 save_data(all_data, "today_province")

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

3.国外数据的爬取 只需在上面的代码末尾直接加上这段代码就可以了。
"""爬取世界各国的疫情数据""" world_data = https://www.it610.com/article/datas["data"]["areaTree"] worlds_data = https://www.it610.com/article/get_data(world_data, ["id", "name", "lastUpdateTime"]) save_data(worlds_data, "today_worlds")

这时你可能就会蒙圈了,为什么呢?
Python爬虫|python爬虫(网易新冠疫情数据爬取(一))
文章图片

这是因为国外的数据是在
json数据data中的areaTree是列表格式,每个元素都是一个国家的实时数据,每个元素的children是各国家省份的数据,
而在areaTree键值对下,
areaTree —> 2 --> children 。就是我国各省的实时数据
如果你没有仔细查看网页里数据结构,name现在应该有所明白的吧!
现在你也还可以继续回到网页继续翻看存放数据源的结构。
这里便是我爬取储存的数据
Python爬虫|python爬虫(网易新冠疫情数据爬取(一))
文章图片

数据展示部分
Python爬虫|python爬虫(网易新冠疫情数据爬取(一))
文章图片

Python爬虫|python爬虫(网易新冠疫情数据爬取(一))
文章图片

4.爬取数据的可视化分析(pyecharts) pyecharts数据可视化:对爬取的新冠疫情数据进行可视化(二)
部分结果展示:
【Python爬虫|python爬虫(网易新冠疫情数据爬取(一))】Python爬虫|python爬虫(网易新冠疫情数据爬取(一))
文章图片

    推荐阅读