我使用scraper
模块和queue
模块的async
函数编写了一个刮刀。
我从json文件中读取要废弃的URL列表,并将信息写入另一个JSON文件中。
这是我的剧本:
var fs = require("fs");
var scrap = require("scrap"),
async = require("async");
var errors = [];
// Queue a list of URLs
var queue = JSON.parse(fs.readFileSync("products.json", "utf8"));
var len = queue.products.length;
var q = async.queue(function (url, done) {
scrap(url, function(err, $) {
var product = {};
product.name = $("#page-body h2").first().text().trim();
product.myarr = [];
product.picture = $(".content img").first().attr("src");
try {
if (product.picture.indexOf("someword") > 1) {
delete product.picture;
}
}
catch (e) {
console.error(e);
}
$(".content [style^=\"color: #\"] [style=\"font-weight: bold\"], .content [style=\"font-weight: bold\"] [style^=\"color: #\"]").each(function() {
product.myarr.push($(this).text().trim().toLowerCase());
});
if (product.myarr.length) {
fs.appendFile("products-parsed.json", JSON.stringify(product) + ",\n", function (err) {
console.log(queue.products.indexOf(url), len, err);
if (err) { errors.push(queue.products.indexOf(url)); }
done();
});
}
});
}, 20);
q.drain = function() {
console.log(errors);
};
q.push(queue.products);
当我运行它时,在大约3.000页之后,它停止(退出)并且它不会给出任何错误,我必须从最新的工作页面开始使用:
q.push(queue.products.slice(lastWorkedPage, queue.products.length - 1));
如何解决此问题?
答案 0 :(得分:0)
不确定为什么,顺便说一句,问题是由这一行造成的:
console.log(queue.products.indexOf(url), len, err);
评论它已经解决了问题,请随意提供更准确的答案,解释解决方案,我会将其设置为已接受。
答案 1 :(得分:0)
尚无评论,所以我必须发布新答案。
我可以确认console.log - 错误。尝试使用console.log()时,NodeJS / Express有时会停止!
一个测试项目的代码:
console.log(req.body.credentials.password, isMatch);
if (isMatch) {
sess.currentUser = user;
console.log(user);
res.send({ status: "ok", loginUser: user });
}
else {
res.send({ status : "error", msg: "Login failed!" });
}
第二个日志记录行(console.log(user))无错误地停止NodeJS!这种情况只发生在某些环境中 - 在大多数开发环境中,这都可以正常工作!