對於疫情數據很多平臺都提供了接口,但是他們的數據都是一併返回的,需要用戶自己去處理,並且信息不全,我這裏對幾個平臺的數據進行了處理,然後保存到自己的數據庫中。再使用node編寫接口,給大家提供方便。
我這裏使用的是天行API提供的接口
var tianxing = 'http://api.tianapi.com/txapi/ncov/index?key=****' //自行去天行API註冊獲取key值
var city = 'http://api.tianapi.com/txapi/ncovcity/index?key=****'
沒10分鐘進行一次數據更新
這裏主要是對返回的數據進行處理,對於省級數據、市級數據、全國總數據,在更新前都會清空原來的數據。這裏當時沒有考慮到將每個省市的歷史數據進行保存。具體處理過程如下。
http.get(city, res => {
let html = ''
res.on('data', data => {
html += data
})
res.on('end', () => {
let data = JSON.parse(html).newslist
let proviceinsertData = ''
let areainsertData = ''
let totalCont = {
confirmedCount: 0,
curedCount: 0,
deadCount: 0
}
for (let i = 0; i < data.length; i++) {
let provice = data[i]
totalCont.confirmedCount += provice.confirmedCount
totalCont.curedCount += provice.curedCount
totalCont.deadCount += provice.deadCount
proviceinsertData += `('${provice.provinceShortName}',${provice.confirmedCount},${provice.curedCount},${provice.deadCount}),`
let citys = provice.cities
for (let j = 0; j < citys.length; j++) {
let city = citys[j]
areainsertData += `('${provice.provinceShortName}','${city.cityName}',${city.confirmedCount},${city.suspectedCount},${city.curedCount},${city.deadCount}),`
}
}
proviceinsertData = proviceinsertData.substr(0, proviceinsertData.length - 1)
areainsertData = areainsertData.substr(0, areainsertData.length - 1)
if (data.length != 0) {
//保存省級數據
database.query('truncate table province')
database.query(`insert into province (provinceName,confirmedNum,curesNum,deathsNum) values ${proviceinsertData}`, err => {
if (err)
console.log(err);
else
console.log('省級數據保存完成');
})
//保存市級數據
database.query('truncate table area')
database.query(`insert into area (provinceName,cityName,confirmedCount,suspectedCount,curedCount,deadCount) values ${areainsertData}`, err => {
if (err)
console.log(err);
else
console.log('地區數據保存完成');
})
//全國總數據
database.query('truncate table china')
database.query(`insert into china (diagnosed,suspect,death,cured) values
(${totalCont.confirmedCount},${0},${totalCont.deadCount},${totalCont.curedCount})`, err => {
if (err)
console.log(err);
else
console.log('全國數據保存完成');
})
}
getTime()
})
})
獲取新聞數據,這與上面不同,新聞數據每次都是返回最新的20條數據,我將所有的歷史數據都需要保存,所以這裏不能採用上面的方法。當每次獲取到新的20條數據時,會存在與老數據相同的內容,這種情況是不需要重複保存的,所以需要一個判斷的過程,只保存新的數據。
//獲取新聞數據
http.get(tianxing, res => {
let html = ''
res.on('data', data => {
html += data
})
res.on('end', () => {
let data = JSON.parse(html).newslist
let news = data[0].news
let now = new Date().getTime()
if(news != null)
for (let index = 0; index < news.length; index++) {
let data = news[index];
// newsinsertData += `(${data.id},'${formatTime(parseInt((data.pubDate +'').substr(0,10)))}','${data.pubDateStr}','${data.title}','${data.summary}',
// '${data.infoSource}','${data.sourceUrl}','${data.provinceName}','${formatTime(parseInt((data.createTime +'').substr(0,10)))}','${formatTime(parseInt((data.modifyTime +'').substr(0,10)))}'),`
(function (data) {
database.query(`select id from news where id = ${data.id}`, (err, result) => {
if (!result.length) {
database.query(`insert into news values (${data.id},'${formatTime(parseInt((data.pubDate +'').substr(0,10)))}','${data.pubDateStr}','${data.title}','${data.summary}',
'${data.infoSource}','${data.sourceUrl}','${data.provinceName}','${formatTime(parseInt((data.createTime +'').substr(0,10)))}','${formatTime(parseInt((data.modifyTime +'').substr(0,10)))}')`, err => {
if (err)
console.log(err);
else
console.log('新增新聞數據');
})
} else {
let time = (now - parseInt((data.pubDate + '')))
database.query(`update news set pubDateStr='${data.pubDateStr}' where id = ${data.id}`, err => {
if (err)
console.log(err);
})
}
})
})(data)
}
})
})
源碼已上傳到github:https://github.com/DengZhanyong/2019-nCoV-real-time-data
最後我使用node編寫了更加靈活方便的數據接口,具體如下:
注:所有接口全部爲GET請求
獲取全國總數據
http://www.dzyong.top:3005/yiqing/total
獲取歷史數據(最早到1月23日數據)
http://www.dzyong.top:3005/yiqing/history
獲取各省/市最新總數據
http://www.dzyong.top:3005/yiqing/province
請求參數:
參數名 | 是否必填 | 說明 |
province |
否 | 當爲空或不填時,返回所有省/市最新總數據,當傳參時要注意,不要帶‘省’或‘市’字,如:‘重慶市’應填‘重慶’ |
獲取各省/市/地區數據
http://www.dzyong.top:3005/yiqing/area
請求參數:
參數名 | 是否必填 | 說明 |
area | 否 | 當爲空或不填時,返回所有省市地區數據,當傳參時要注意,不要帶‘省’或‘市’字,如:‘重慶市’應填‘重慶’ |
獲取最新動態新聞(最早到2月6日數據)
http://www.dzyong.top:3005/yiqing/news
請求參數:
參數名 | 是否必填 | 說明 |
pageNum |
否 | 頁碼未填時,默認查詢所有新聞) |
pageSize |
否 | 每頁新聞條數(未填時,默認查詢所有新聞) |
注:返回結果中的 pubDateStr 字段僅爲參考時間,若想實時更新,可通過 pubDate 字段自行計算
通向博主個人網站
我的網站:www.dzyong.top
公衆號: 《前端筱園》