javascript - nightmarejs 使用 querySelectorAll 抓取多个元素

标签 javascript node.js web-scraping nightmare

我正在尝试使用 nightmarejs(使用 electron 作为浏览器的 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。

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

最佳答案

您遇到的问题是 document.querySelectorAll() 返回 DOMElementNodeList。这两种对象类型不能很好地序列化,.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
})

关于javascript - nightmarejs 使用 querySelectorAll 抓取多个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42471836/

相关文章:

javascript - jQuery 通过动态 minHeight 调整大小

javascript - 在 ng-repeat 中增加 $index

javascript - 将下拉菜单的背景扩展到浏览器的全宽

r - 使用 rvest 抓取带有登录页面的网站

r - 使用 R 从 timeanddate.com 抓取表格

javascript匿名函数作用域行为

node.js - Mongoose :无法在 `_id` 上为模型名称 "SchemaName"指定自定义索引,MongoDB 不允许覆盖默认的 `_id` 索引

javascript - Angular2 : How to go from an "ng serve" hosting to a Node. Js托管

javascript - 如何使用这些异步函数在 JavaScript 中处理 MySQL 查询?

python - 使用 BS4 在 Python 中进行网页抓取 - 获取动态生成的列表