对于疫情数据很多平台都提供了接口,但是他们的数据都是一并返回的,需要用户自己去处理,并且信息不全,我这里对几个平台的数据进行了处理,然后保存到自己的数据库中。再使用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
http://www.dzyong.top:3005/yiqing/history
http://www.dzyong.top:3005/yiqing/province
请求参数:
参数名 | 是否必填 | 说明 |
province |
否 | 当为空或不填时,返回所有省/市最新总数据,当传参时要注意,不要带‘省’或‘市’字,如:‘重庆市’应填‘重庆’ |
http://www.dzyong.top:3005/yiqing/area
请求参数:
参数名 | 是否必填 | 说明 |
area | 否 | 当为空或不填时,返回所有省市地区数据,当传参时要注意,不要带‘省’或‘市’字,如:‘重庆市’应填‘重庆’ |
http://www.dzyong.top:3005/yiqing/news
请求参数:
参数名 | 是否必填 | 说明 |
pageNum |
否 | 页码未填时,默认查询所有新闻) |
pageSize |
否 | 每页新闻条数(未填时,默认查询所有新闻) |
注:返回结果中的 pubDateStr 字段仅为参考时间,若想实时更新,可通过 pubDate 字段自行计算
我的网站:www.dzyong.top
公众号: 《前端筱园》