【问题标题】:Node.js - Using a callback function with CheerioNode.js - 在 Cheerio 中使用回调函数
【发布时间】:2013-06-17 04:49:36
【问题描述】:

我正在 Node 中构建一个爬虫,它使用 requestcheerio 加载页面并解析它们。

重要的是,我只在请求和 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


【解决方案1】:

是的,cheerio.load 是同步的,您不需要任何回调。

request(url, function (err, resp, body) {
  if (err) {
    return console.log("Error!: " + err + " using " + url);
  }
  var $ = cheerio.load(body);
  // do stuff with the `$` content here
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2018-01-11
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多