我已经用 cheerio
和 request
制作了一个网络爬虫,现在我正在尝试在 url 数组上实现一个循环。
不幸的是,我的通话和回调出了问题,但我不知道是什么。
这是我的代码:
var getWebData = function(url) {
var i = 1;
var data = [];
for (c = 0; c < url.length; c++) {
data[i] = request(url[c], function(err, resp, body) {
console.log('ok');
if (!err) {
console.log('there');
var $ = cheerio.load(body);
$('.text').each(function(i, element) {
var jsObject = { name : "", description : "", price: "", categorie: "", pricePerKg: "", capacity: "", weight: "", scrapingDate : "", url: ""};
var name = 'TESTOK';
jsObject.name = name;
data.push(jsObject);
})
return data;
}
console.log('but');
});
i++;
}
var json = JSON.stringify(data);
fs.writeFile('output.json', JSON.stringify(json, null, 4), function(err) {
console.log('File successfully written!');
})
}
getWebData(url);
app.listen('8080');
请注意,我的任何调试打印都没有打印。
有谁知道我的代码出了什么问题以及我该如何使其工作?
最佳答案
请求是 Aysnc
var json = JSON.stringify(data);
fs.writeFile('output.json', JSON.stringify(json, null, 4), function(err) {
console.log('File successfully written!');
})
上面的代码在 for 循环完成执行并填充数据对象之前运行。 尝试在循环完成执行时执行这段代码。
首先运行此命令 npm install async --save
var async = require('async');
var getWebData = function(url){
var data = [];
async.eachSeries(url, function(urlSingle , cb){
request(urlSingle, function(err, resp, body) {
//write your logic here and push data in to data object
cb();
})
},function(){
// this will rum when loop is done
var json = JSON.stringify(data);
fs.writeFile('output.json', JSON.stringify(json, null, 4), function(err) {
console.log('File successfully written!');
});
});
}
关于Javascript/NodeJS 回调函数和循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41722184/