在每个请求节点js中设置间隔

bxgwgixi  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(335)

我必须使webscraping应用程序,但我读到,如果会有很多的要求,然后网站可以阻止我的ip。

cn.query('SELECT url FROM models', function (err, row, field) {
    for (i in row) {
        request(row[i].url, (err, res, body) => {
            if (!err && res.statusCode === 200) {
                const $ = cheerio.load(body);
          //after getting data

            let sql = "INSERT INTO prodchar (year, Display, displaysize, os, Chipset, cpu, gpu, memoryslot, Storage, PrimaryCam, videocam, FrontCam, wlan, bluetooth, batdesc) VALUES ?";
                              // console.log(cn.query(sql, [arr]));
                              cn.query(sql, [[arr]], function(err, res) {
                                console.log(res);
                                if (err) throw err;
                                cn.query(
                                  "DELETE n1 FROM spec n1, spec n2 WHERE n1.id > n2.id AND n1.name = n2.name"
                                );
                              });
            }
        });
    }
});

这是代码的开始。我必须从数据库获取链接,并在每次迭代中进入数据库并获取数据。如何为每个迭代行[i].url设置间隔?例如,为每个请求设置2分钟。请帮忙!:)

6yjfywim

6yjfywim1#

也许你应该试试设置超时,像这样?

cn.query('SELECT url FROM models', function(err, rows, field) {

    let timeout = 2000; // 2 seconds

    let doRequest = (it, row) => {
        setTimeout(() => {
            request(row.url, (err, res, body) => {
                if (!err && res.statusCode === 200) {
                    const $ = cheerio.load(body);
                }
            });
        }, it * timeout);
    };

    // Loop and call doRequest for each iteration
    for (let [it, row] of rows.entries()) {
        doRequest(it, row);
    }
});

希望有帮助。

j2qf4p5b

j2qf4p5b2#

按如下方式使用异步库:

let interval = 5000;   
async.eachSeries(urlList, function (url, done) {
    setTimeout(function () {
        request(url, function(error, resp, body) { 
            if (error) return callback(error); 
            var $ = cheerio.load(body);
            done();
        });
    }, interval);
}, function (err) {
    if (!err) callback();
});

相关问题