疫情大数据信息爬取与可视化

146 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

image.png

image.png

本文仅做技术分享讨论,无其他用途

import re
from lxml import etree
from docx import Document
from docx.shared import Pt
from docx.shared import Inches
from docx.oxml.ns import qn
import os
import random
import requests
import pygal
import json

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40'}
url = 'https://voice.baidu.com/api/newpneumonia?from=page&callback=jsonp_1663662885340_48451'

response = requests.get(url = url,headers=headers)
print(response.status_code)
nn = ""
try:


   # resp = json.loads(response.text)

    resp = (response.text)
    for i in resp:
        nn+=i
    tt = nn[26:-2]
    # print(tt)
    re_json = json.loads(tt)
    # print(re_json["data"]["outbreakReport"]["data"])
    list_1 = re_json["data"]["outbreakReport"]["data"]
    for i in list_1:


        # 图表名

        # 添加数据
        # view.add('A', 31)
        # view.add('B', 55)
        # view.add('C', 14)
        # 保存为view.svg(也可以保存为jpg)
        # view.render_to_file('view.svg')
        city = i['area']+i['city']
        leiji_confirm = i['confirmed']
        died = i['died']
        cured = i['crued']
        nowconfirm = i['curConfirm']
        xingzeng = i['confirmedRelative']
        view = pygal.Pie(inner_radius=0.4)
        view.title = '{}疫情情况饼状图'.format(city)
        view.add('累计确诊', leiji_confirm)
        view.add('不幸离世数', died)
        view.add('治愈数', cured)
        view.add('现有确诊数',nowconfirm)
        view.add('新增本土', xingzeng)
        view.render_to_file('D:\定时器\饼图{}疫情.svg'.format(city))

        ###############################################
        # gauge = pygal.SolidGauge(inner_radius=0.70)
        # percent_formatter = lambda x: '{:.10g}%'.format(x)
        # # dollar_formatter = lambda x: '{}$'.format(x)
        # gauge.value_formatter = percent_formatter
        #
        # # gauge.add('Series 1', [{'value': 225000, 'max_value': 1275000}],
        # #           formatter=dollar_formatter)
        # gauge.add('累计确诊', [{'value': leiji_confirm, 'max_value': leiji_confirm+xingzeng}])
        # gauge.add('死亡', [{'value': died, 'max_value': leiji_confirm+xingzeng}])
        # # gauge.add(
        # #     '', [
        # #         {'value': 51, 'max_value': 100},
        # #         {'value': 12, 'max_value': 100}])
        # gauge.add('治愈数', [{'value': cured, 'max_value': leiji_confirm+xingzeng}])
        # gauge.add('现有确诊数', [{'value': nowconfirm, 'max_value': leiji_confirm+xingzeng}])
        # gauge.add('新增本土', [{'value': xingzeng, 'max_value': leiji_confirm+xingzeng}])
        # # gauge.add('Series 6', 99)
        # # gauge.add('Series 7', [{'value': 100, 'max_value': 100}])
        # gauge.render_to_file('D:\定时器\疫情情况{}疫情.svg'.format(city))
        print(city,leiji_confirm,died,cured,nowconfirm,xingzeng)
        # view = pygal.Bar()
        # # 图表名
        # view.title = '柱状图'
        # # 添加数据
        # view.add('numbers', [0, 2, 4, 6, 8, 10])
        # # 在浏览器中查看
        # # view.render_in_browser()
        # # 保存为view.svg(也可以保存为jpg)
        # view.render_to_file('view.svg')

    # kop = re_json.items()
    # print(kop)
    # print(re_json)

except Exception as ex:
   print(ex)
# response.encoding = 'utf-8'
#
#
# html = response.text

# data = json.loads(html)
# print(html)
# print(type(html))
#
# #将字符串转换成字典
# dict_json = json.loads(html)
# print(dict_json)

技术原理包含了网络爬虫,json解析,pygal的使用和可视化

爬虫技术简介: 1. 伪装headers,获取response,当然本次没有获取实时更新:新型冠状病毒肺炎疫情地图 (baidu.com),因为他是经过了 js脚本的渲染,我们获取到的 网页源码,并不包含数据信息,所以逐个筛选网络中刷新的网页,找到一个URL,记载了所有data

2.对获取到的字符串转换成字典,使用json的loads()函数, 这里有一个坑,因为字典信息被元组包起来了,所以我就使用了字符串的切片,包含了字典, 再转换就没有问题了

3.接下来就是获取需要的信息,我随机选取了中国的疫情信息,用字典获取,最好对应网页去看,因为json的量很大,我们找不到对应的层级关系,如图:

image.png

image.png

我们找到相对应的数据之后,就要数据分析了,这里我用的是pygal,非常犀利的一款可视化库, 我们找到官方文档: 馅饼 — pygal 2.0.0 文档

然后使用实例的源码,稍微修改一下就行,这个库与web,django,flask架构高度贴合, 也非常小众,但是效果非常好

效果如下:

image.png