Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用带有NodeJS的梦魇刮_Javascript_Node.js_Nightmare - Fatal编程技术网

Javascript 使用带有NodeJS的梦魇刮

Javascript 使用带有NodeJS的梦魇刮,javascript,node.js,nightmare,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

我正在尝试将结果刮取并保存到我的数据库中。我正在使用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渲染后,有没有更简单的方法来抓取网页?

首先,我会放弃使用
承诺链
,严格地使用wait/async语法,因为它更清晰、更易于使用

其次,,您还有另一个选择,它可能更快更好地工作,这取决于您正在尝试做什么

我说的是使用、模拟chromium浏览器并通过API控制它,就像噩梦EJS一样


我还为写了一本很好的入门指南,我相信它会有所帮助

噩梦对报废很有效。您不能在evaluate中使用Nodejs模块(至少不能简单地使用)。但是您可以从evaluate()传递任何json。在您的例子中,在包含nodejs模块的then()函数中调用myModel.create()。