使用NightmareJS和NodeJS进行刮擦

时间:2017-05-30 10:02:42

标签: 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渲染的网页。

所以我决定尝试梦魇js,做同样的事情也是一场噩梦:

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);
    });

问题

evaluate()函数中未定义新闻。 evaluate函数似乎只接受字符串,而News是由sails.js创建的模型。

此外,articles数组中填充了相同的数据。

在使用NodeJS进行DOM渲染后,是否有更简单的方法来抓取网页?

1 个答案:

答案 0 :(得分:0)

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

第二,,还有另一种选择供您选择,它可能更快更好,具体取决于您要执行的操作

我正在谈论使用Puppeteer by Google,模拟Chrome浏览器并通过API控制它,就像NightmareJs一样

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