我做了一个非常简单的脚本,它抓住了一个食谱网站,以获得标题,准备时间和成分。一切正常,但脚本无法抓取我的数组的每一页。有时我得到4个,有时2个,有时甚至0个......
似乎脚本没有等待身体完全加载。我完全清楚,cheerio并不了解网站上的javascript,但据我所知,我所知道的信息并非由任何脚本生成,而是纯HTML。
我如何要求cheerio在访问页面时等待1秒钟,或者只是等待html完全加载。
这是我的代码,它可以运行,你可以尝试它,以及输出的一个例子:
pools = [
"http://www.marmiton.org/recettes/recette_salade-de-betteraves-a-l-orientale_16831.aspx",
"http://www.marmiton.org/recettes/recette_pain-d-epices-a-la-dijonnaise_16832.aspx",
"http://www.marmiton.org/recettes/recette_tarte-au-chocolat-et-creme-moka_16834.aspx",
"http://www.marmiton.org/recettes/recette_poulet-a-la-gaston-gerard_16836.aspx",
"http://www.marmiton.org/recettes/recette_assiette-paula_16837.aspx"]
var request = require("request");
var cheerio = require("cheerio");
var poolsLength = pools.length;
for (var i = 0 ; i < pools.length ; i++) {
var url = pools[i];
request(url, function (error, response, body) {
if (!error) {
var $ = cheerio.load(body,{
ignoreWhitespace: true
});
var name = [];
var address = [];
var website = [];
$('body').each(function(i, elem){
name = $(elem).find('.fn').text();
address = $(elem).find('.preptime').text();
website = $(elem).find('.m_content_recette_ingredients').text();
console.log(name+"±"+address+"±"+website);}
)}
})
};`
&#13;
如上所示,它仅适用于5页中的2页。
答案 0 :(得分:0)
您可以尝试以下代码,setTimeout会在抓取之前导致页面加载延迟。
pools = [
"http://www.marmiton.org/recettes/recette_salade-de-betteraves-a-l-orientale_16831.aspx",
"http://www.marmiton.org/recettes/recette_pain-d-epices-a-la-dijonnaise_16832.aspx",
"http://www.marmiton.org/recettes/recette_tarte-au-chocolat-et-creme-moka_16834.aspx",
"http://www.marmiton.org/recettes/recette_poulet-a-la-gaston-gerard_16836.aspx",
"http://www.marmiton.org/recettes/recette_assiette-paula_16837.aspx"]
var request = require("request");
var cheerio = require("cheerio");
var poolsLength = pools.length;
var interval = 10 * 1000; // 10 seconds;
for (var i = 0 ; i < pools.length ; i++) {
var url = pools[i];
setTimeout( function (i) {
request(url, function (error, response, body) {
if (!error) {
var $ = cheerio.load(body,{
ignoreWhitespace: true
});
var name = [];
var address = [];
var website = [];
$('body').each(function(i, elem){
name = $(elem).find('.fn').text();
address = $(elem).find('.preptime').text();
website = $(elem).find('.m_content_recette_ingredients').text();
console.log(name+"±"+address+"±"+website);}
)
}
}, interval * i, i);
})
}
答案 1 :(得分:0)
为了处理许多页面报废,只需提供一个callback
函数来标记任务完成时间,然后使用async.parallel
模块运行。
我的解决方案: