Python爬虫+可视化 疫情地图 pyecharts可视化 实时疫情地图 超级简单js逆向+跟栈(简单易懂)
前言:面对德尔塔变异毒株,当下疫情稍许严峻。
病毒跟随懈怠者,防控没有局外人!
要坚持别扎堆!别侥幸!别偷懒!那我们需要干啥呐?这不该就宅家学习!知晓疫情,学习技术!
一:成果展示:
今天的主人公是网易疫情地图: https:// wp.m.163.com/163/page/n ews/virus_report/index.html
二:流程:
1.抓包:
打开F12;刷新网页;点击XHR,找到第一个包,我们需要的数据就藏在里面!(别问你怎么知道的,问就是自己翻的!)不好看数据的可以复制到 http://www. json.cn 里查看!或者使用火狐浏览器
2.爬取数据:
1)里面没有什么反爬机制,直接来就行。但请求的url: https:// c.m.163.com/ug/api/wuha n/app/data/list-total?t=325784816951 后面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"},