• 实时爬取疫情动态变化并进行可视化展示


    (一)实时爬取疫情的动态变化

    上次的中国的疫情可视化来自已有的数据库表里的数据,不是最新的,因此这次我们要做的就是实时的爬取疫情信息

    我实现爬取的网页是:丁香医生里的数据。

    三步走:

    第一步:获取网页

    通过requests的headers伪装网页访问,获取网页代码

    //ncov.dxy.cn/ncovh5/view/pneumonia?from=timeline&isappinstalled=0'  #请求地址
    headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}#创建头部信息
    response =  requests.get(url,headers = headers)  #发送网络请求
    #print(response.content.decode('utf-8'))#以字节流形式打印网页源码
    content = response.content.decode('utf-8')

    第二步:提取我们想要的数据

    发现在该网页里的script里id="getAreaStat"里面有我们想要的数据,然后我们通过BeautifulSoup对其进行爬取,爬取到后转化为字符串,通过字符转截取到我们想到的数据,将他们转化成json格式,然后建立两个列表,一个保存省份,另一个保存城市数据。

    soup = BeautifulSoup(content, 'html.parser')
    listA = soup.find_all(name='script',attrs={"id":"getAreaStat"})

    account = str(listA)

    messages = account[52:-21]
    messages_json = json.loads(messages)

    valuesList = []
    cityList = []
    数据的存储
    #算出数据库已有的条数+今天省份的条数,才是城市的开始id
    con=len(messages_json)+lenth
    #一共有lenth条信息,现在要往上加今天的信息
    k=lenth
    for i in range(len(messages_json)):

        k=k+1
        value = (k,time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),messages_json[i].get('provinceShortName'),None,messages_json[i].get('confirmedCount'),messages_json[i].get('suspectedCount'),messages_json[i].get('curedCount'),messages_json[i].get('deadCount'),messages_json[i].get('locationId'))
        valuesList.append(value)
        cityValue = messages_json[i].get('cities')

        for j in range(len(cityValue)):
            con=con+1
            cityValueList = (con,time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),messages_json[i].get('provinceShortName'),cityValue[j].get('cityName'),cityValue[j].get('confirmedCount'),cityValue[j].get('suspectedCount'),cityValue[j].get('curedCount'),cityValue[j].get('deadCount'),cityValue[j].get('locationId'))
            cityList.append(cityValueList)
           
    value_tuple = tuple(valuesList)
    cityTuple = tuple(cityList)

    第三步:存储数据到MySql

    首先在表中查询当前表中一共有多少条数据,然后再进行插入,这样不会出现id重复。这样每天都会更新数据库里的信息并且还会保存昨天的信息

    这样在进行可视化时数据量将会更多,更加具有可比性。

    总的代码:

    from os import path
    import requests
    from bs4 import BeautifulSoup
    import json
    import pymysql
    import numpy as np
    import time

    url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia?from=timeline&isappinstalled=0'  #请求地址
    headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}#创建头部信息
    response =  requests.get(url,headers = headers)  #发送网络请求
    #print(response.content.decode('utf-8'))#以字节流形式打印网页源码
    content = response.content.decode('utf-8')

    soup = BeautifulSoup(content, 'html.parser')
    listA = soup.find_all(name='script',attrs={"id":"getAreaStat"})

    account = str(listA)

    messages = account[52:-21]
    messages_json = json.loads(messages)

    valuesList = []
    日期 开始时间 结束时间 中断时间 净时间 活动 备注
    3/10 15:35 16:00 0 25 安装Pycharm,配置环境 喝水
    3/10 16:10 17:00 0 50 分析网页数据,学习爬虫知识  
    3/10 17:05 18:20 15 60 学习连接数据库,将数据分析并导入到MySql里 喝水,上厕所
    3/10 18:30 18:45 0 15 将数据库里的数据与之间的web联系,构成实时可视化数据显示  

    缺陷记录日志

    日期 编号 类型 引入阶段 排除阶段 修复阶段 修复缺陷
    3/10 1 逻辑问题 编码 运行 10分钟  
    描述:导入到数据库表里的id号码重复
    3/10 2 逻辑问题 编码 运行 5min  
    描述:建立数据库与web可视化时,数据全部导入进去,导致柱状图容不下显示出错

    总共用时:150分钟,代码量80行左右

  • 相关阅读:
    kafka学习笔记:知识点整理
    java操作hbase 增删改查
    json往前台送数据中文乱码
    17年数据结构笔记
    设置MYSQL数据库编码为UTF-8
    c++的 struct和class
    算法之arrays and strings
    对于快速排序的理解
    sql杂记
    Spring搭建练习遇到的坑
  • 原文地址:https://www.cnblogs.com/zzmds/p/13085540.html
Copyright © 2020-2023  润新知