我编写的肺炎疫情数据API的实现过程

对于疫情数据很多平台都提供了接口,但是他们的数据都是一并返回的,需要用户自己去处理,并且信息不全,我这里对几个平台的数据进行了处理,然后保存到自己的数据库中。再使用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

公众号: 《前端筱园》

你可能感兴趣的:(Node.js)