使用python爬取疫情数据

信息来源

网址:点我
在这里插入图片描述
现在我们来分析一下网页的请求消息,发现了这个请求的响应消息就是我们要的疫情信息
在这里插入图片描述
我们来看一下响应消息,因为响应消息太过于庞大,我们在这里放一张图片,就不放文本信息了
在这里插入图片描述
可以看到这里确实是有各个地区的疫情数据的

python3实现获取数据

实际上这个请求并没有什么反爬取的东西,我们直接爬取就可以了

  • 首先就是url
url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-total'
  • 为了能够请求成功我们需要一些请求头来把我们伪装成浏览器,其实直接复制自己浏览器当中的就可以了
headers = {
    'accept': '*/*',
    'accept-encoding': 'gzip,deflate,br',
    'accept-language': 'en-US,en;q=0.9,zh-CN;q = 0.8,zh;q = 0.7',
    'origin': 'https://wp.m.163.com',
    'referer': 'https://wp.m.163.com/',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-ite',
    'user-agent': 'Mozilla/5.0(WindowsNT10.0;Win64;x64) AppleWebKit/37.36 (KHTML, likeGecko) Chrome/82.0.4056.0 Safari/537.36 Edg/82.0.432.3'
}
  • 下面就是使用requests代码块当中的get方法来发送请求并获取响应消息
result = requests.get(url, headers=headers)

使用json代码块来处理响应消息

其实通过上面我们就已经获得请求消息了也就是result.text就是我们的响应消息,但是正如我们上面图片的那样数据确实太乱了,但是我们可以使用python当中的json来将数据转化为dictionary

  • JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。
    其实要的就是loads方法
json_dict = json.loads(result.text)
print(type(json_dict))
print(json_dict.keys())

输出如下:

<class 'dict'>
dict_keys(['reqId', 'code', 'msg', 'data', 'timestamp'])

通过type方法我们可以看出来,loads之后信息就变成了dictionary,并且键值data当中的就是我们要的数据,后面我们继续一层一层的解析就可以了

json_str = json.loads(result.text)['data']
# print(json_str.keys())
# dict_keys(['chinaTotal', 'chinaDayList', 'lastUpdateTime', 'areaTree'])

print(json_str['lastUpdateTime'])
provinae_list = json_str['areaTree'][0]['children'] # 各省份的疫情信息表,是个List[dict]
# 每个省份包含如下的键
# dict_keys(['today', 'total', 'extData', 'name', 'id', 'lastUpdateTime', 'children'])

最后遍历一下就可以了

for dict in provinae_list:
    sys.stdout.write('%-10s' % dict['name'] + '  ')
    print_mess('累计', dict['total'])
    sys.stdout.write('  ')
    print_mess('今日新增', dict['today'])
    print()
    for child_dict in dict['children']:
        sys.stdout.write('  %-10s' % child_dict['name'] + '  ')
        print_mess('累计', child_dict['total'], )
        sys.stdout.write('  ')
        print_mess('今日新增', child_dict['today'])
        print()

完整的代码以及程序的输出

  • 代码
import requests
import time, json
import sys;


def get_wangyi_request():
    url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-total'

    headers = {
        'accept': '*/*',
        'accept-encoding': 'gzip,deflate,br',
        'accept-language': 'en-US,en;q=0.9,zh-CN;q = 0.8,zh;q = 0.7',
        'origin': 'https://wp.m.163.com',
        'referer': 'https://wp.m.163.com/',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-ite',
        'user-agent': 'Mozilla/5.0(WindowsNT10.0;Win64;x64) AppleWebKit/37.36 (KHTML, likeGecko) Chrome/82.0.4056.0 Safari/537.36 Edg/82.0.432.3'
    }

    result = requests.get(url, headers=headers)
    return result


def print_mess(string: str, dict_total: dict):
    sys.stdout.write(string + '确诊: ' + str(dict_total['confirm'] if dict_total['confirm'] != None else 0))
    sys.stdout.write(' ')
    sys.stdout.write(string + '疑似: ' + str(dict_total['suspect'] if dict_total['suspect'] != None else 0))
    sys.stdout.write(' ')
    sys.stdout.write(string + '治愈: ' + str(dict_total['heal'] if dict_total['heal'] != None else 0))
    sys.stdout.write(' ')
    sys.stdout.write(string + '死亡: ' + str(dict_total['dead'] if dict_total['dead'] != None else 0))


if __name__ == '__main__':
    result = get_wangyi_request()

    json_str = json.loads(result.text)['data']
    # print(json_str.keys())
    # dict_keys(['chinaTotal', 'chinaDayList', 'lastUpdateTime', 'areaTree'])

    print(json_str['lastUpdateTime'])
    provinae_list = json_str['areaTree'][0]['children']
    # 每个省份包含如下的键
    # dict_keys(['today', 'total', 'extData', 'name', 'id', 'lastUpdateTime', 'children'])


    for dict in provinae_list:
        sys.stdout.write('%-10s' % dict['name'] + '  ')
        print_mess('累计', dict['total'])
        sys.stdout.write('  ')
        print_mess('今日新增', dict['today'])
        print()
        for child_dict in dict['children']:
            sys.stdout.write('  %-10s' % child_dict['name'] + '  ')
            print_mess('累计', child_dict['total'], )
            sys.stdout.write('  ')
            print_mess('今日新增', child_dict['today'])
            print()

  • 输出
    在这里插入图片描述
    最后结合数据可视化,就可以得到类似的疫情地图了
发布了95 篇原创文章 · 获赞 19 · 访问量 4274

猜你喜欢

转载自blog.csdn.net/qq_43446165/article/details/104600099