首发于 python爬虫
Python爬虫+可视化 疫情地图 pyecharts可视化 实时疫情地图 超级简单js逆向+跟栈(简单易懂)

Python爬虫+可视化 疫情地图 pyecharts可视化 实时疫情地图 超级简单js逆向+跟栈(简单易懂)

前言:面对德尔塔变异毒株,当下疫情稍许严峻。 病毒跟随懈怠者,防控没有局外人! 要坚持别扎堆!别侥幸!别偷懒!那我们需要干啥呐?这不该就宅家学习!知晓疫情,学习技术!

一:成果展示:

今天的主人公是网易疫情地图: wp.m.163.com/163/page/n

​​

​​ 二:流程:

1.抓包:

打开F12;刷新网页;点击XHR,找到第一个包,我们需要的数据就藏在里面!(别问你怎么知道的,问就是自己翻的!)不好看数据的可以复制到 json.cn 里查看!或者使用火狐浏览器

​​​

2.爬取数据:

1)里面没有什么反爬机制,直接来就行。但请求的url: c.m.163.com/ug/api/wuha 后面t这个时间戳奇奇怪怪的 325784816951 ,可以去找一下怎么生成的。(注:时间戳并没有任何影响,只是去看看!可以跳过这一步,这就是很简单不过的js调试)

A.使用XHR断点:就是复制请求连接的一段固定值 app/data/list-total

B.下了断点刷新网页,断后发现函数传递进来就有t值。

C.跟踪栈,点击./src/js/index.j 数据有点大,或许会卡!

​ D.进来就发现 t 就赤裸裸的摆在这儿!就是得到时间值,除5,取整

​​ 3.爬虫代码

代码很简单,直接获取json数据,从中取出来需要的数据就行!唯一有点扯的问题就是数据中没有新增人数,新增人数=累计人数-治愈人数-死亡人数

import time
import requests
# 可视化库
from pyecharts import options as opts
from pyecharts.charts import Map
# 得到疫情数据 从网易疫情地图得知 url:https://wp.m.163.com/163/page/news/virus_report/index.html
def get_data():
    t = int(time.time()/5)
    url = "https://c.m.163.com/ug/api/wuhan/app/data/list-total?t={}".format(t)
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0'}
    response = requests.get(url, headers=headers).json()
    all_data = response['data']['areaTree'][2]['children']
    new_people = []     # 新增人数
    all_people = []     # 累计人数
    for people in all_data:
        name = people['name']
        number = people['total']
        confirm = number['confirm']
        heal = number['heal']
        dead = number['dead']
        # 新增人数是通过累计人数-治愈人数-死亡人数
        new = confirm-heal-dead
        new_people.append([name,new])
        all_people.append([name,confirm])
    return new_people,all_people

4.可视化代码

点击运行,就会生成一个html。

# 数据可视化
def get_map():
    new_people, all_people = get_data()
    c = (
        Map()
            .add("现有确诊", [z for z in new_people], "china", is_selected=True,  # is_selected=True 谁先显示
                 itemstyle_opts=opts.ItemStyleOpts(color='#0f0'))  # is_roam=False 关闭缩放
            .add("累计确诊", [j for j in all_people], "china", is_selected=False,
                 itemstyle_opts=opts.ItemStyleOpts(color='red'))
            .set_global_opts(
            title_opts=opts.TitleOpts(title="实时疫情",subtitle="中国"),
            legend_opts=opts.LegendOpts(selected_mode='single'),
            visualmap_opts=opts.VisualMapOpts(max_=max(i[1] for i in all_people),
                                              is_piecewise=True,  # 是否分段
                                              # 自定义的每一段的范围,以及每一段的文字,以及每一段的特别的样式
                                              pieces=[
                                                  {"value": 0, 'color': "#e2ebf4"},
                                                  {"min": 1, "max": 9, 'color': "#ffe7b2"},
                                                  {"min": 10, "max": 99, 'color': "#ffcea0"},
                                                  {"min": 100, "max": 499, 'color': "#ffa577"},
                                                  {"min": 500, "max": 999, 'color': "#ff6341"},
                                                  {"min": 1000, "max": 9999, 'color': "#ff2736"},
                                                  {"min": 10000, 'color': "#de1f05"},