python网页数据抓取(先上代码看了一下应该是Pyecharts中Map的data_pair )

优采云 发布时间: 2022-02-14 08:05

  python网页数据抓取(先上代码看了一下应该是Pyecharts中Map的data_pair

)

  2021/07/15 更新:

  没有及时看到评论区的反馈。我真的很抱歉。我把代码拉下来看了看。应该是Pyecharts中Map的data_pair数据类型发生了变化。现在将 dic_items 转换为列表。

  代码已整理完善,完整源码已上传至Gitee,地址:完整源码

  所有生成的csv、疫情图、可视化图表都在项目根目录下。

  总结:

  受2019-nCoV影响,一场没有硝烟的防疫阻击战已经打响。在全国人民的共同努力下,疫情正在逐步稳定,但我们仍不能掉以轻心。

  疫情开始前,我每天都在关注疫情,尤其是全国疫情地图。在那之后,我一直想自己拿数据做一个,但我没有坚持去做。前几天用Python爬取了结果查询网站,照着做,完成了这个需求。

  话不多说,先上图吧:

  

  中国疫情地图

  

  各省详情

  

  湖北省各城市疫情数据分布

  目录

  数据源分析:

  数据来自丁香博士:

  博士。丁香的数据如下图所示:

  

  

  看到这里,你可能觉得应该直接把这个数据放到tr,td或者ul,li里面,直接发送请求,获取页面DOM中的文本就行了

  一开始我也是这么想的,但是看了网页的源码后才发现不是-_-||

  

  

  其实中国每个省份的数据都是存储在脚本标签中,id为getAreaStat,然后动态渲染到视图上。

  所以我们要做的就是获取脚本标签中id为getAreaStat的文本

  数据管理:

  不难看出script标签中的数据是以json的形式存储的。我们验证和格式化 json 字符串并组织其中的数据。

  

  左边的密集数据格式化后,很直观的看到json字符串的内部存储,大致如下:在整个json字符串中,每个province是一个dict,每个province里面的city省是一个子列表存储该省的城市数据。

  代码部分代码中要使用的第三方库如下:一、抓取全国各省疫情信息,生成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,很不错!

  建议不了解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库,可以说是收获颇丰!因此,在这里一起分享和学习!

  最后,加油武汉,加油中国!疫情终将过去,春天终将到来!

  

  图片来自网络

  希望你下次运行这段代码时,看到的疫情图是这样的:

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线