我摆弄周围请求承诺抓取网页的朋友。 我现在用的爬行网页更好的对自己的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
发挥作用?
你可以创建自己的效用函数,创建你的选择,然后调用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只是常规代码保理(或任何语言)。
裹在函数内部,并保持与因此在一段时间递归休息的条件调用它。
(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) {
});
})();