【发布时间】:2013-06-17 04:49:36
【问题描述】:
我正在 Node 中构建一个爬虫,它使用 request 和 cheerio 加载页面并解析它们。
重要的是,我只在请求和 Cheerio 完成页面加载之后才进行回调。我正在尝试使用async extension,但我不完全确定将回调放在哪里。
request(url, function (err, resp, body) {
var $;
if (err) {
console.log("Error!: " + err + " using " + url);
} else {
async.series([
function (callback) {
$ = cheerio.load(body);
callback();
},
function (callback) {
// do stuff with the `$` content here
}
]);
}
});
我一直在阅读cheerio documentation,但找不到任何内容加载时的回调示例。
最好的方法是什么?当我在脚本中抛出 50 个 URL 时,它开始在cheerio 正确加载内容之前过早地继续前进,我试图通过异步加载来遏制任何错误。
总的来说,我对异步编程和回调完全陌生,所以如果我在这里遗漏了一些简单的东西,请告诉我。
【问题讨论】:
-
cheerio.load据我所知是一种同步方法,因此无需使用async。你说的“它开始过早”是什么意思?您是否想限制/处理对request的调用? -
同步是指阻塞吗? (我认为这是正确的术语...节点会等待它完成?)
-
@robertklep 另外回答你的问题,当我向它抛出很多链接时,我会发生奇怪的事情。我根据从 URL 中抓取的信息创建了一个对象,有时字段丢失,通常所有字段都丢失。我正在尝试构建一些可以防止这种情况的东西,但问题可能只是在其他地方。
-
load是一个有点误导的名字,它真的应该被命名为parse什么的。是的,它正在阻塞。根据您调用request的方式,您可能会同时启动一大堆请求,这可能会导致问题。但是,如果没有您调用它的上下文,很难说 :) -
@robertklep 明白了,感谢您的帮助!不幸的是,这是我创建的一个相当大的脚本(我正在尝试对其进行分段并使其更加模块化)所以这不是我完整发布的内容,因为上帝知道我的问题会被否决:) 只是试图解决问题并消除问题。感谢您的帮助。
标签: node.js asynchronous cheerio