實時爬取疫情動態變化並進行可視化展現

(一)實時爬取疫情的動態變化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行左右

相關文章
相關標籤/搜索