疫情数据爬取

目标网站

腾讯新闻提供的疫情实时追踪网站https://news.qq.com/zt2020/page/feiyan.htm

如何抓取包含所有疫情信息的API

  1. 以火狐浏览器为例,用火狐浏览器打开目标网站,按下F12进入web开发者模式,进入network模块并刷新网页:

在这里插入图片描述

  1. 按类型进行排序,找到json格式的文件,网站从服务器获取数据的方法为get,从而锁定了三个请求:
    在这里插入图片描述

  2. 在消息头中找到相应的请求网址进行排查,从而顺利找到数据接口:

https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5

数据爬取

需要导入的包

import pandas as pd
import requests
import json

网站将所有信息以json的格式存在data这个变量中,先获取data变量的信息:

url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
area = requests.get(url).json()
data = json.loads(area['data'])

获取最近一次的更新时间

update_time = data['lastUpdateTime']

获得各个国家疫情信息

all_counties = data['areaTree']
for country_data in all_counties:
    print(country_data['name'])
中国
日本
新加坡
泰国
韩国
澳大利亚
美国
马来西亚
德国
越南
法国
加拿大
阿联酋
菲律宾
印度
意大利
英国
俄罗斯
尼泊尔
斯里兰卡
芬兰
瑞典
柬埔寨
比利时
西班牙

获取各个省市疫情情况

只分析国内疫情情况,可以写一个简单的if判断:

if country_data['name'] != '中国':
    continue
else:
    all_provinces = country_data['children']     # children包含了各个省的情况

两句逻辑连在一起

 for country_data in all_counties:
        if country_data['name'] != '中国':
            continue
        else:
            all_provinces = country_data['children']
all_provinces[-1]
{'name': '西藏',
 'children': [{'name': '地区待确认',
   'total': {'confirm': 1, 'suspect': 0, 'dead': 0, 'heal': 0},
   'today': {'confirm': 0, 'suspect': 0, 'dead': 0, 'heal': 0}}],
 'total': {'confirm': 1, 'suspect': 0, 'dead': 0, 'heal': 0},
 'today': {'confirm': 0, 'suspect': 0, 'dead': 0, 'heal': 0}}

获取相应的地级市疫情情况

获取地级市名称信息

for province_data in all_provinces:
    province_name = province_data['name']
    all_cities = province_data['children']

市区名称获取

all_cities[0]['name']
'地区待确认'

total是一个字典,里面包含了确诊,治愈,死亡的人数信息

all_cities[0]['total']
{'confirm': 1, 'suspect': 0, 'dead': 0, 'heal': 0}

利用for循环将所有信息存在一个空列表中

all_list = []
for province_data in all_provinces:
        province_name = province_data['name']
        all_cities = province_data['children']
        for city_data in all_cities:
                city_name = city_data['name']
                city_total = city_data['total']
                province_result = {'province': province_name, 'city': city_name,'update_time': update_time}
                province_result.update(city_total)
                all_list.append(province_result)

转换成dataframe数据结构

df = pd.DataFrame(all_list)
print(df.head())
  city  confirm  dead  heal province  suspect          update_time
0   武汉    10117   414   454       湖北        0  2020-02-06 15:04:04
1   孝感     1886    25     9       湖北        0  2020-02-06 15:04:04
2   黄冈     1807    29    60       湖北        0  2020-02-06 15:04:04
3   随州      834     9     9       湖北        0  2020-02-06 15:04:04
4   荆州      801    10    18       湖北        0  2020-02-06 15:04:04

数据保存

保存为csv文件

df.to_csv('data.csv', index=False,encoding="utf_8_sig")

结果展示

在这里插入图片描述

完整代码

import pandas as pd
import requests
import json


def get_data():
    url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
    area = requests.get(url).json()
    data = json.loads(area['data'])
    update_time = data['lastUpdateTime']
    all_counties = cn_data['areaTree']
    all_list = []
    for country_data in all_counties:
        if country_data['name'] != '中国':
            continue
        else:
            all_provinces = country_data['children']
            for province_data in all_provinces:
                province_name = province_data['name']
                all_cities = province_data['children']
                for city_data in all_cities:
                    city_name = city_data['name']
                    city_total = city_data['total']
                    province_result = {'province': province_name, 'city': city_name,'update_time': update_time}
                    province_result.update(city_total)
                    all_list.append(province_result)

    df = pd.DataFrame(all_list)
    df.to_csv('data.csv', index=False,encoding="utf_8_sig")


if __name__ == '__main__':
    get_data()
发布了58 篇原创文章 · 获赞 77 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/weixin_41503009/article/details/104197112