实时抓取网页数据(先上代码看了一下应该是Pyecharts中Map的data_pair )
优采云 发布时间: 2021-11-05 09:08实时抓取网页数据(先上代码看了一下应该是Pyecharts中Map的data_pair
)
2021/07/15 更新:
没及时看到评论区的反馈。对不起,真相。拉下代码看Pyecharts中Map的data_pair数据类型。它现在应该转换为列表。
代码已整理完善,完整源代码已上传至Gitee,地址:完整源代码
所有生成的csv、流行病地图、可视化图表都在项目根目录下。
概括:
受2019-nCoV影响,一场没有硝烟的抗击疫情已经打响。在全国人民的共同努力下,疫情正在逐步趋于稳定,但我们仍不能掉以轻心。
疫情还没开始的时候,我每天都在关注疫情,尤其是全国疫情地图。之后一直想拿到资料自己做一个,但没有坚持去做。前几天用Python爬取了分数查询网站,跟着做这个需求。
话不多说,先上图吧:
中国疫情地图
各省详情
湖北省各城市疫情数据分布
内容
数据来源分析:
数据来自丁香博士:
丁香博士的数据如下图所示:
看到这里,你可能会觉得这个数据应该直接放在tr,td或者ul,li里面,直接发送请求,获取页面DOM中的文本即可。
起初我是这样想的。看了网页的源码,才发现不是-_-||
实际上,中国每个省的数据都存储在id为getAreaStat的script标签中,然后动态渲染到视图中。
所以我们要做的就是抓取脚本标签中id为getAreaStat的文本内容
数据整理:
不难看出,script标签中的数据是以json的形式存储的,我们对json字符串进行校验和格式化,将里面的数据组织起来。
左边密集的数据格式化后,可以很直观的看到json字符串的内部存储情况,大致如下:在整个json字符串中,每个省都是一个dict,每个省的城市是用于存储省内城市的子列表。数据。
代码部分需要用到的第三方库如下: 一、 抓取全国各省疫情信息,生成csv文件基础
1.代码分析:
2. 源代码:
import requests
from pyquery import PyQuery as pq
import json
import pandas as pd
import time
def get_data():
url = "https://ncov.dxy.cn/ncovh5/view/pneumonia"
response = requests.get(url)
if response.status_code == 200:
response.encoding = "utf-8"
dom = pq(response.content)
data = dom("script#getAreaStat").text().split(" = ")[1].split("}catch")[0]
jsonObj = json.loads(data) # json对象
print("数据抓取成功...")
province_data = []
for item in jsonObj:
dic = {"省全称": item["provinceName"], "省简称": item["provinceShortName"], "现存确诊人数": item["currentConfirmedCount"],
"累计确诊人数": item["confirmedCount"], "疑似人数": item["suspectedCount"], "治愈人数": item["curedCount"],
"死亡人数": item["deadCount"]}
province_data.append(dic)
if len(province_data) > 0:
print("写入数据...")
try:
df = pd.DataFrame(province_data)
time_format = time.strftime("%Y-%m-%d_%H_%M_%S", time.localtime())
df.to_csv(time_format + "全国各省疫情数据.csv", encoding="gbk", index=False)
print("写入成功...")
except Exception as e:
print(f"写入失败....{e}")
if __name__ == '__main__':
get_data()
3.操作效果:
二、使用pyecharts绘制中国疫情高级地图
说到画表,第一个想到的就是Apache开源的echarts框架,高效强大。因为对Matplotlib库不熟悉,拿到数据后想用echarts框架的前端画一个,后来才知道有专门的pyecharts,所以很nice!
建议不懂echarts或pyecharts的同学一定要先阅读官方API,了解基本图表类型和各种参数,或者把各种参数写成一个链式操作,会有点别扭((⊙﹏⊙⊙) )) 哦!
1.代码分析:
2. 源代码:
"""
@File : data_chart.py
@Modify Time @Author @Version @Desciption
------------ ------- -------- -----------
2021/7/15 9:25 wrzcoder 1.0 None
"""
from pyecharts import options as opts
from pyecharts.charts import Map
import requests
from pyquery import PyQuery as pq
import json
import time
def map_visual_map() -> Map:
c = (
Map(init_opts=opts.InitOpts(page_title="中国疫情地图"))
.add("现存确诊人数", data_pair=list(current_data_dic.items()), maptype="china")
.set_global_opts(
title_opts=opts.TitleOpts(title="中国疫情地图", subtitle="数据更新于" + time_format),
visualmap_opts=opts.VisualMapOpts(pieces=[
{"value": 0, "label": "无", "color": "#9AFF9A"},
{"min": 1, "max": 9, "label": "1~9", "color": "#FFCCCC"},
{"min": 10, "max": 99, "label": "10~99", "color": "#DB5A6B"},
{"min": 100, "max": 499, "label": "100~499", "color": "#FF6666"},
{"min": 500, "max": 999, "label": "500~999", "color": "#CC2929"},
{"min": 1000, "max": 9999, "label": "1000~9999", "color": "#8C0D0D"},
{"min": 10000, "label": ">10000", "color": "#9d2933"}
], is_piecewise=True),
)
)
return c
if __name__ == '__main__':
try:
url = "https://ncov.dxy.cn/ncovh5/view/pneumonia"
response = requests.get(url)
if response.status_code == 200:
response.encoding = "utf-8"
dom = pq(response.content)
data = dom("script#getAreaStat").text().split(" = ")[1].split("}catch")[0]
jsonObj = json.loads(data) # json对象
print("数据抓取成功...")
current_data_dic = {}
time_format = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
for item in jsonObj:
current_data_dic[item["provinceShortName"]] = item["currentConfirmedCount"]
print(list(current_data_dic.items()))
map_visual_map().render("疫情地图.html")
print('疫情地图已生成在项目根目录...')
except Exception as e:
print(e)
3.操作效果:
三、 抓取全国各省市疫情数据,拓展数据可视化
我们上面只用到了每个省的数据,在分析开始的时候,每个省的dict还收录了省、市(区)的数据,我们不能浪费这些数据,一定要在什么时候用我们抓取它们。好好利用它,我们将全国各省市的所有疫情数据进行分类可视化。
这里我想说的是:我们在可视化各省(直辖市)下的市(区)的疫情数据时,也可以使用pyecharts中的Map,但是为了更熟悉pyecharts,让我们更改为表格类型的饼图。
看起来非常麻烦。需要请求每个省的数据收录城市,最后画图太麻烦了,不过还是不行(*^▽^*) 30行代码就够了
1.代码分析
2.源代码
"""
@File : province_data_chart.py
@Modify Time @Author @Version @Desciption
------------ ------- -------- -----------
2021/7/15 9:45 wrzcoder 1.0 None
"""
import requests
import json
from pyecharts.charts import Pie
import pyecharts.options as opts
import time
from pyquery import PyQuery as pq
import os
def create_Pie(provinceName, dic_citys) -> Pie:
c = (
Pie(init_opts=opts.InitOpts(width="100%", height="800px", page_title=provinceName + "各市(区)情况"))
.add("", data_pair=list(dic_citys.items()), center=["50%", "58%"], )
.set_global_opts(title_opts=opts.TitleOpts(title=provinceName + "各市(区)情况", subtitle="数据更新于:" + timeformat))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
if not os.path.exists('./中国各省情况'):
os.mkdir('./中国各省情况')
c.render("./中国各省情况/" + provinceName + "各市(区)情况.html")
if __name__ == '__main__':
try:
url = "https://ncov.dxy.cn/ncovh5/view/pneumonia"
timeformat = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
response = requests.get(url)
response.encoding = "utf-8"
if response.status_code == 200:
print("数据抓取成功!")
dom = pq(response.text)
jsonobj = json.loads(dom("script#getAreaStat").text().split(" = ")[1].split("}catch")[0])
for province in jsonobj:
dic_city = {}
for city in province["cities"]:
dic_city[city["cityName"]] = city["currentConfirmedCount"]
if dic_city.__len__() > 0:
create_Pie(province["provinceName"], dic_city)
print(province["provinceName"] + "各市数据汇总完毕!")
except Exception as e:
print(e)
3.操作效果:
只需1.1s,我们就抓取了全国各省市的疫情数据,整理并生成了数据图表
打开随机饼图查看效果:
四川省各城市疫情数据汇总
至此,我们已经完成了对全国各省市实时疫情数据的采集和处理,绘制了中国疫情图。在此基础上,我们进一步拓展并开展了中国各省、自治区、直辖市疫情数据的批量归一化和可视化工作。这期间复习了requests库、pandas、pyquery库等,还学习学习了强大的图表pyecharts库,收获颇丰!所以在这里分享一下,一起了解和学习!
最后,加油武汉,加油中国!疫情终会过去,春天一定会来!
图片来自网络
我希望下次我运行这段代码时,我看到的疫情图会是这样的: