使用 cheerio js 进行网页抓取时获取额外信息

getting back additional info when webscraping with cheerio js

我正在与 cheerio.js 合作制作一个简单的网络抓取工具。出于某种原因,它不响应某些 html 标签。 我无法定位的 div 是 div 和 'dataTables_scrollBody' 的 class 在我正在抓取的网站上:http://www.caffeineinformer.com/the-caffeine-database.

不过,我想我找到了解决问题的方法。

我通读了文档 https://github.com/cheeriojs/cheerio 并遵循这种格式 $( selector, [context], [root]

$(".main, div:nth-child(3) ").filter(function(){
        var data = $(this).prev().text();
        console.log(data);
})

在我的控制台中,我得到了我想要的数据,但有两个问题

1.  Caffeine Content of Drinks All Coffee Soda Energy Drinks Tea Shots
    Loading data.../*<![CDATA[*/var totalrows=1127;
    var latestdate='06/12/2015';var tbldata=

我在页面上没有看到此信息。

2.  I am getting my data back two times.

我输入了console.log作为数据长度。我得到了 8 种不同的长度。我相信有一个解决方法。但是,我无法弄清楚这一点。

有没有人知道这件事?

DataTables 是一个 Javascript 库,它动态创建、插入和修改 DOM 中的 HTML 元素,after 页面加载。您要抓取的 table 是动态创建的,但您的抓取器仅适用于静态 HTML。

用于生成 table 的数据在页面源中存储为 Javascript,在一个名为 tbldata 的变量中(参见 this gist)。

两种可能的解决方案:

  • 使用类似 PhantomJS 的方式加载页面,这也会 运行 页面上的任何 JS。之后,您可以获取 DOM 并使用 Cheerio 解析它;
  • 直接从嵌入的 Javascript 中抓取 table 数据。

Robert klep 是正确的,我试图抓取数据表。我发现虽然 cheerio 使用 jquery,但它确实访问了 phantom js 内部的数据 table。我最终使用了一个非常基本的库 node-phantom-simple。 Node phantom simple 与 jQuery 配合使用效果很好,并且有基本但直接的示例。

我能够要求 node phantom simple 然后 运行 nodemon 来完成我的抓取。

Node phantom 简单访问,不需要用户在命令行调用phantomjs。