抓取网站时如何比较更改?

时间:2019-04-30 17:29:45

标签: node.js

关注此问题:Trouble monitoring website changes using node

我正在尝试抓取openmarketcap API,然后在价格变化时提醒我。

到目前为止,我已经完成了大部分的初始编码,我使用SetInterval每2.5秒调用一次该函数,并且确实看到了价格变化,但是我没有得到我期望的结果。我试图让它与旧数组中的最后一个调用进行比较,并将其与新的scrape进行比较。我想这是我犯的一个愚蠢的错误,仍然是游戏的学生!

const request = require("request");
const fs = require("fs");

function discord(messages){
    request({
        url: "https://discordapp.com/api/webhooks/57143540025348169/notmyrealwebhook",
        method: "POST",
        json: messages
    }),
        function(body, response, error){
            console.log(body);
            if(error){
                console.log(error);
        }
    };
}

const headers = {
    "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36",
    "Upgrade-Insecure-Requests" : "1"
}

const options = {
    url: "http://api.openmarketcap.com/api/v1/tokens",
    headers: headers,
    json: true
}

let oldCoinData = [];
let initial = true;

const call = () => {
    request(options, function(err, response, body){

        if(err){
            console.log(err);
        }

        const data = body.data;
        let coinData = [];

        if(initial){
            for(i in data){
                oldCoinData.push(data[i])
            }
        }

        if(initial == false){
            for(i in data){
                coinData.push(data[i]);
            }

            oldCoinData = coinData;
        }

        let oldPrice = oldCoinData[0].price_usd;
        let newPrice = coinData[0].price_usd;

        console.log(oldPrice, newPrice);

        if(oldPrice != newPrice){
            console.log("Bitcoin price change!!!!");
            console.log(`Bitcoin was ${oldPrice}, it is now ${newPrice}`);
        }
        else if(oldPrice === newPrice){
            console.log("No changes detected.");
        }

    })
};

initial = false;
const delay = 2500;

setInterval(call, delay);

我认为我的问题出在oldCoinData = coinData上,但是我不确定每次调用它时如何在初始化时比较两个数组。

更改后,应该存储了旧数组,新的刮板应该将价格与旧数组进行比较。但是,由于我的代码行oldCoinData = coinData,在调用该函数时会将它们设置为相等。不确定如何获取它以比较旧数据和新数据。因此,我的逻辑有些错误。

https://imgur.com/a/eRtUnna

1 个答案:

答案 0 :(得分:0)

有许多问题需要修正和建议。现在,让我们忘记真正的openmarketcap api,并考虑这个模拟的请求功能

let data = [{ price_usd: 5298 }]
setInterval(() => {
  data = [{ price_usd: data[0].price_usd + 100 }]
  console.log('--- price has definitely changed ---')
}, 5000)

const request = (option, cb) => {
  cb(undefined, undefined, { data })
}

每5秒提供一次不同的price_usd值,因此可以确定您确实获得了不同的值。

第一个问题是,甚至在initial设置为true的情况下,request(...)回调至少被调用一次之前,initial设置为false。要解决此问题,请将initial = false;移至if(initial){...}

接下来,由于没有先前的数据可比较,因此在相同的if语句中添加了一个返回值。

正如您所建议的那样,问题还在于该配置oldCoinData = coinData;。您真正想做的是仅在检测到价格变化时才用新数据覆盖oldCoinData,因此,当价格再次发生变化时,oldPrice != newPrice的评估结果为true。