【问题标题】:nightmarejs scrape multiple Elements with querySelectorAllnightmarejs 使用 querySelectorAll 抓取多个元素
【发布时间】:2017-02-26 17:34:30
【问题描述】:

我正在尝试使用 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。

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

【问题讨论】:

    标签: javascript node.js web-scraping nightmare


    【解决方案1】:

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

    【讨论】:

    • 这可能是大多数人的最佳解决方案。但是,如果您必须对数据进行许多提取/测试/等操作,那么对我来说效果很好的完全不同的方法是简单地返回return document.body.innerHTML,然后在节点端实例化一个 jsdom 和/或 jquery 对象。在这一点上,与虚拟 dom 的交互是微不足道的。
    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2020-03-24
    • 1970-01-01
    相关资源
    最近更新 更多