我正在尝试抓取结果并将其保存到我的数据库中。我正在使用 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/