Cheerio 不等待 body 加载
Cheerio doesn't wait for body to load
我制作了一个非常简单的脚本,用于抓取食谱网站以获取标题、准备时间和配料。一切正常,除了脚本无法抓取我数组的每一页。有时我得到 4 个,有时 2 个,有时甚至 0 个 ...
似乎脚本没有等待 body 完全加载。我完全知道 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);}
)}
})
};`
正如您在上面看到的,它只对 5 页中的 2 页有效。
您可以试试下面的代码,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);
})
}
为了处理很多页面报废,只要给出一个callback
函数来标记任务何时完成,然后使用async.parallel
模块运行。
我的解决方案:
我制作了一个非常简单的脚本,用于抓取食谱网站以获取标题、准备时间和配料。一切正常,除了脚本无法抓取我数组的每一页。有时我得到 4 个,有时 2 个,有时甚至 0 个 ...
似乎脚本没有等待 body 完全加载。我完全知道 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);}
)}
})
};`
正如您在上面看到的,它只对 5 页中的 2 页有效。
您可以试试下面的代码,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);
})
}
为了处理很多页面报废,只要给出一个callback
函数来标记任务何时完成,然后使用async.parallel
模块运行。
我的解决方案: