我正在尝试抓取并将结果保存到我的数据库中。我正在使用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渲染后,是否有更简单的方法来抓取网页?
答案 0 :(得分:0)
首先,我会放弃使用Promise Chains
和严格的use await/async
语法,因为它更清晰,更易于使用
第二,是,还有另一种选择供您选择,它可能更快更好,具体取决于您要执行的操作
我正在谈论使用Puppeteer by Google,模拟Chrome浏览器并通过API控制它,就像NightmareJs一样
我还为 Scraping with Puppeteer 写了一个很好的入门指南,我相信它会有所帮助!