移动到一个新的页面请求承诺的最佳方法是什么?(Best method of moving to a

2019-11-05 06:59发布

我摆弄周围请求承诺抓取网页的朋友。 我现在用的爬行网页更好的对自己的GitHub的例子。 我到目前为止是这样的:

var rp = require('request-promise');
var cheerio = require('cheerio'); // Basically jQuery for node.js

var options = {
  uri: 'https://friendspage.org',
  transform: function(body) {
    return cheerio.load(body);
  }
};

rp(options)
  .then(function($) {
    // Process html like you would with jQuery...
    var nxtPage = $("a[data-url$='nxtPageId']").attr('data');

    // How do I use nxtPage here to go to that site

  })
  .catch(function(err) {
    // Crawling failed or Cheerio choked...
  });

什么是去我在链接的正确方法nxtPage ? 我还是希望能够使用就可以了cheerio / jQuery的。 我需要重复整个var option = ...事情目前里面then发挥作用?

Answer 1:

你可以创建自己的效用函数,创建你的选择,然后调用rp()是这样的:

const rp = require('request-promise');
const cheerio = require('cheerio'); // Basically jQuery for node.js

// shared function
function getPage(url) {
    const options = {
        uri: url,
        transform: function(body) {
          return cheerio.load(body);
        }
    };
    return rp(options);
}

getPage('https://friendspage.org').then($ => {
    // Process html like you would with jQuery...
    const nxtPage = $("a[data-url$='nxtPageId']").attr('data');
    return getPage(nxtPage).then($ => {
        // more processing here
    });
}).catch(err => {
    console.log(err);
    // error handling here
});

这只是保理要在多个地方使用到一个共享的功能代码。 特别无关rp()cheerio ,在Javascript只是常规代码保理(或任何语言)。



Answer 2:

裹在函数内部,并保持与因此在一段时间递归休息的条件调用它。

(function repeatUntilAConditionIsMetInThen(uri = 'https://friendspage.org')
  var options = {
    uri,
    transform: function(body) {
      return cheerio.load(body);
    }
  };
  rp(options)
    .then(function($) {
      var nxtPage = $("a[data-url$='nxtPageId']").attr('data');
      //There should be some condition here otherwise it will be infinite loop
      repeatUntilAConditionIsMetInThen(nxtPage);
    })
   .catch(function(err) {
   });
})();


文章来源: Best method of moving to a new page with request-promise?