0
点赞
收藏
分享

微信扫一扫

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

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

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

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

三步走:

第一步:获取网页

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

 

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

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

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格式,然后建立两个列表,一个保存省份,另一个保存城市数据。

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

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

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

数据的存储

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

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

#算出数据库已有的条数+今天省份的条数,才是城市的开始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

第三步:存储数据到MySql

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

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

总的代码:

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

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

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行左右

 



举报

相关推荐

0 条评论