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

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

上次的中国的疫情可视化来自已有的数据库表里的数据,不是最新的,所以此次咱们要作的就是实时的爬取疫情信息mysql

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

三步走:sql

第一步:获取网页数据库

经过requests的headers假装网页访问,获取网页代码json

 

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')
View Code

 

第二步:提取咱们想要的数据网络

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

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 = []
View Code
数据的存储
#算出数据库已有的条数+今天省份的条数,才是城市的开始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)
View Code

第三步:存储数据到MySqlide

首先在表中查询当前表中一共有多少条数据,而后再进行插入,这样不会出现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 = [] cityList = [] #从数据库中查找目前有多少条信息
db = pymysql.connect("localhost", "root", "fengge666", "yiqing", charset='utf8') cursor = db.cursor() sql_findsum="select * from info3" lenth=0 try: cursor.execute(sql_findsum) results = cursor.fetchall() lenth=len(results) db.commit() except: print('执行失败,进入回调1') db.rollback() #算出数据库已有的条数+今天省份的条数,才是城市的开始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) sql = "INSERT INTO info3 values (%s,%s,%s,%s,%s,%s,%s,%s,%s) "

try: cursor.executemany(sql, value_tuple) db.commit() except: print('执行失败,进入回调3') db.rollback() try: cursor.executemany(sql,cityTuple) db.commit() except: print('执行失败,进入回调4') db.rollback() db.close()
View Code

 

日期 开始时间 结束时间 中断时间 净时间 活动 备注
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行左右

相关文章
相关标签/搜索