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

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

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

  1. cn.query('SELECT url FROM models', function (err, row, field) {
  2. for (i in row) {
  3. request(row[i].url, (err, res, body) => {
  4. if (!err && res.statusCode === 200) {
  5. const $ = cheerio.load(body);
  6. //after getting data
  7. let sql = "INSERT INTO prodchar (year, Display, displaysize, os, Chipset, cpu, gpu, memoryslot, Storage, PrimaryCam, videocam, FrontCam, wlan, bluetooth, batdesc) VALUES ?";
  8. // console.log(cn.query(sql, [arr]));
  9. cn.query(sql, [[arr]], function(err, res) {
  10. console.log(res);
  11. if (err) throw err;
  12. cn.query(
  13. "DELETE n1 FROM spec n1, spec n2 WHERE n1.id > n2.id AND n1.name = n2.name"
  14. );
  15. });
  16. }
  17. });
  18. }
  19. });

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

6yjfywim

6yjfywim1#

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

  1. cn.query('SELECT url FROM models', function(err, rows, field) {
  2. let timeout = 2000; // 2 seconds
  3. let doRequest = (it, row) => {
  4. setTimeout(() => {
  5. request(row.url, (err, res, body) => {
  6. if (!err && res.statusCode === 200) {
  7. const $ = cheerio.load(body);
  8. }
  9. });
  10. }, it * timeout);
  11. };
  12. // Loop and call doRequest for each iteration
  13. for (let [it, row] of rows.entries()) {
  14. doRequest(it, row);
  15. }
  16. });

希望有帮助。

展开查看全部
j2qf4p5b

j2qf4p5b2#

按如下方式使用异步库:

  1. let interval = 5000;
  2. async.eachSeries(urlList, function (url, done) {
  3. setTimeout(function () {
  4. request(url, function(error, resp, body) {
  5. if (error) return callback(error);
  6. var $ = cheerio.load(body);
  7. done();
  8. });
  9. }, interval);
  10. }, function (err) {
  11. if (!err) callback();
  12. });

相关问题