nightmarejs 使用 querySelectorAll 抓取多个元素
nightmarejs scrape multiple Elements with querySelectorAll
我正在尝试使用 nightmarejs(使用 electron 作为浏览器的 phantomjs 派生)从 Instagram 个人资料页面中抓取一些信息。
目标是获取配置文件中所有图片的 alt 标签(为了举例,我只关注 "show more" 按钮之前的图片)
var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true });
nightmare
.goto('https://www.instagram.com/ackerfestival/')
.evaluate(function () {
let array = [...document.querySelectorAll('._icyx7')];
return array.length;
})
.end()
.then(function (result) {
console.log(result);
})
.catch(function (error) {
console.error('Search failed:', error);
});
这个例子有效,数组长度为12。electron浏览器打开和关闭,一切正常。但是如果我将 return 更改为数组,电子浏览器永远不会关闭并且我不会得到 console.log.
我做错了什么?我想从数组或对象中的图像中获取所有信息。
您遇到的问题是 document.querySelectorAll()
return 个 NodeList
个 DOMElement
个。这两种对象类型不能很好地序列化,.evaluate()
中的 return 值必须跨越 IPC 边界进行序列化——我打赌你在 [= 的另一边得到一个空数组14=]打电话?
这里最简单的答案是明确您想要从 NodeList
中得到什么。从臀部来看,像下面这样的东西应该可以理解这个想法:
.evaluate(function(){
return Array.from(document.querySelectorAll('._icyx7')).map(element => element.innerText);
})
.then((innerTexts) => {
// ... do something with the inner texts of each element
})
我正在尝试使用 nightmarejs(使用 electron 作为浏览器的 phantomjs 派生)从 Instagram 个人资料页面中抓取一些信息。
目标是获取配置文件中所有图片的 alt 标签(为了举例,我只关注 "show more" 按钮之前的图片)
var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true });
nightmare
.goto('https://www.instagram.com/ackerfestival/')
.evaluate(function () {
let array = [...document.querySelectorAll('._icyx7')];
return array.length;
})
.end()
.then(function (result) {
console.log(result);
})
.catch(function (error) {
console.error('Search failed:', error);
});
这个例子有效,数组长度为12。electron浏览器打开和关闭,一切正常。但是如果我将 return 更改为数组,电子浏览器永远不会关闭并且我不会得到 console.log.
我做错了什么?我想从数组或对象中的图像中获取所有信息。
您遇到的问题是 document.querySelectorAll()
return 个 NodeList
个 DOMElement
个。这两种对象类型不能很好地序列化,.evaluate()
中的 return 值必须跨越 IPC 边界进行序列化——我打赌你在 [= 的另一边得到一个空数组14=]打电话?
这里最简单的答案是明确您想要从 NodeList
中得到什么。从臀部来看,像下面这样的东西应该可以理解这个想法:
.evaluate(function(){
return Array.from(document.querySelectorAll('._icyx7')).map(element => element.innerText);
})
.then((innerTexts) => {
// ... do something with the inner texts of each element
})