(一)實時爬取疫情的動態變化
上次的中國的疫情可視化來自已有的數據庫表里的數據,不是最新的,因此這次我們要做的就是實時的爬取疫情信息
我實現爬取的網頁是:丁香醫生里的數據。
三步走:
第一步:獲取網頁
通過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')
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 = []
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)
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 = []
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行左右