【问题标题】:Node request, cheerio - how to handle additional ajax load节点请求,cheerio - 如何处理额外的 ajax 负载
【发布时间】:2015-11-08 10:46:11
【问题描述】:

我正在使用节点、请求和cheerio 从 html 页面获取数据。这没有任何问题,但是一个页面通过 ajax 加载额外的数据来填充不同的容器。当初始请求完成时,这些是空且未定义的,我该如何处理?

request(url, function (error, response, html) {
if (!error && response.statusCode == 200) {

    var $ = cheerio.load(html);

    forum_url = $('.this.url.is.loaded.separatly.with.ajax'[1].attr('href');
}
});

【问题讨论】:

标签: ajax node.js web-scraping request cheerio


【解决方案1】:

Cheerio 在设计时并没有真正考虑到 ajax。如果您能够提取需要下载的 url,则可能需要维护多个单独的 $ 对象,因为它们不太可能轻松合并。

通常,如果您需要执行在抓取的页面上找到的 javascript,我们会求助于 Phantom.js。 Phantom 是您使用 javascript 控制的无头浏览器,非常酷。

您可以在此处查看一些 Phantom.js 网页抓取代码:http://code4node.com/snippet/web-scraping-with-node-and-phantomjs

【讨论】:

  • 所以在使用cheerio.load 之前没有额外的参数或方法来保持和等待页面加载的额外时间?或者是否可以使用 DOMNodeInserted 事件。否则,如果有另一个类似的节点模块呢?必须有一个解决方法,在这种情况下,幻影不是我的选择。对其他人如何解决类似问题感兴趣。
  • 通过检查 dom 解决了我的问题,看看是否有其他方法可以遍历数据。我发现每个 ajax 调用都使用具有不同查询 id 的相同 url,所以我将 id 存储在第一个循环中,然后使用每个系列的异步迭代 id。
  • 您的链接已失效。 http://code4node.com/snippet/web-scraping-with-node-and-phantomjs
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
相关资源
最近更新 更多