javascript - 使用带有 NodeJS 的 NightmareJS 进行抓取

标签 javascript node.js nightmare

我正在尝试抓取结果并将其保存到我的数据库中。我正在使用 NodeJS(sails.js 框架)

这是一个使用 cheerio 的工作示例:

getRequest('some-url').then((data) => {
    const $ = cheerio.load(data);
    let title = $('.title').each(function (i, element) {
        let a = $(this);
        let title = a.text(); // Title
        MyModel.create({title : title}).exec((err, event) => {
        });
    });
});

cheerio 的问题在于它不充当浏览器,也不呈现任何 javascript 呈现的网页。

所以我决定试试 Nightmare js,做同样的事情是一场 Nightmare :

var articles = [];
Promise.resolve(nightmare
    .goto('some-url')
    .wait(0)
    .inject('js', 'assets/js/dependencies/jquery-3.2.1.min.js')
    .evaluate((articles) => {
        var article = {};
        var list = document.querySelectorAll('h3 a');
        var elementArray = [...list];
        elementArray.forEach(el => {
            article.title = el.innerText;
            articles.push(article);
            myModel.create({title : article.title}).exec((err, event) => {
            });
        });
        return articles;
    }, articles)
    .end())
    .then((data) => {
        console.log(data);
    });

问题

News 没有在 evaluate() 函数中定义。评估函数似乎只接受字符串,而 News 是由 sails.js 创建的模型。

此外,文章数组填充了相同的数据。

在使用 NodeJS 呈现 DOM 后,是否有任何更简单的方法来抓取网页?

最佳答案

首先,我会放弃使用 Promise Chains 并严格使用 await/async 语法,因为它更清晰且易于使用

其次,,您还有另一种选择,它可能更快更好,具体取决于您尝试做什么

我说的是使用 Puppeteer by Google , 模拟 chromium 浏览器并通过 API 控制它,就像 NightmareJs

我还为写了一个很好的入门指南Scraping with Puppeteer ,我相信它会有所帮助!

关于javascript - 使用带有 NodeJS 的 NightmareJS 进行抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44259177/

相关文章:

javascript - 调用 Bootstrap Modal 时显示正确的选项卡

node.js - Sequelize 事务和增量

node.js - 如何将触发操作中的对话框与提示分开 (Microsoft Botbuilder SDK)

node.js - 如何单击此链接进入下一页? [复制]

javascript - 使用 JavaScript 获取文本内容并写入 HTML

javascript捕获div中的每个值

javascript - CSS3 列的第 n 个子元素

javascript - 嵌入的一个值中的多行(discord.js)

javascript - 如何使用 Nightmare 点击此链接?

javascript - 如何使我的变量成为全局变量以及如何使程序等待特定条件?