Javascript 使用带有NodeJS的梦魇刮
我正在尝试将结果刮取并保存到我的数据库中。我正在使用NodeJS(sails.js框架) 这是一个使用cheerio的工作示例: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
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()。