我編寫的肺炎疫情數據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

公衆號: 《前端筱園》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章