nightmarejs使用querySelectorAll

时间:2017-02-26 17:34:30

标签: javascript node.js web-scraping nightmare

我正在尝试使用nightmarejs(使用电子作为浏览器的phantomjs衍生物)从Instagram个人资料页面中搜索一些信息。

目标是获取配置文件中所有图像的alt标签(例如,我只关注“显示更多”按钮之前的图像)

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.电子浏览器打开和关闭,所以一切都很好。但如果我将返回更改为只是数组,电子浏览器永远不会关闭,我没有得到console.log。

我做错了什么?我想从数组或对象中的图像中获取所有信息。

1 个答案:

答案 0 :(得分:8)

您遇到的问题是document.querySelectorAll()返回NodeListDOMElement。这两个对象类型没有很好地序列化,并且.evaluate()的返回值必须在IPC边界上序列化 - 我打赌你在.evaluate()调用的另一端得到一个空数组?

这里最简单的答案是根据NodeList确定您想要的内容。从时髦的角度来看,类似下面的内容应该是我们的想法:

.evaluate(function(){
  return Array.from(document.querySelectorAll('._icyx7')).map(element => element.innerText);
})
.then((innerTexts) => {
  // ... do something with the inner texts of each element
})