Nano Hash - криптовалюты, майнинг, программирование

Nightmare, PhantomJS и извлечение данных страницы

Я новичок в Nightmare/PhantomJS и изо всех сил пытаюсь получить простой список всех тегов на данной странице. Я работаю на Ubuntu 14.04 после сборки PhantomJS из исходного кода и установки NodeJS, Nightmare и т. д. вручную, и другие функции, похоже, работают так, как я ожидаю.

Вот код, который я использую:

var Nightmare = require('nightmare');
new Nightmare()
  .goto("http://www.google.com")
  .wait()
  .evaluate(function () 
   {
     var a = document.getElementsByTagName("*");
     return(a);
   }, 
   function(i) 
   {
     for (var index = 0; index < i.length; index++)
     if (i[index])
        console.log("Element " + index + ": " + i[index].nodeName);
    })
  .run(function(err, nightmare) 
  {
     if (err) 
        console.log(err);
  }); 

Когда я запускаю это в «настоящем» браузере, я получаю список всех типов тегов на странице (HTML, HEAD, BODY,...). Когда я запускаю это с помощью node GetTags.js, я просто получаю одну строку вывода:

Element 0: HTML

Я уверен, что это проблема новичка, но что я здесь делаю неправильно?


Ответы:


1

PhantomJS имеет два контекста. Контекст страницы, обеспечивающий доступ к DOM, доступен только через evaluate(). Таким образом, переменные должны явно передаваться в контекст страницы и из него. Но есть ограничение (документы):

Примечание. Аргументы и возвращаемое значение функции evaluate должны быть простым примитивным объектом. Эмпирическое правило: если его можно сериализовать через JSON, то все в порядке.

Замыкания, функции, узлы DOM и т. д. не будут работать!

Функция Nightmare evaluate() является лишь оболочкой одноименной функции PhantomJS. Это означает, что вам нужно будет работать с элементами в контексте страницы и только передавать представление наружу. Например:

.evaluate(function () 
{
    var a = document.getElementsByTagName("div");
    return a.length;
}, 
function(i) 
{
    console.log(i + " divs available");
})
16.06.2015
  • Спасибо за быстрый ответ! 16.06.2015
  • Большое спасибо ... действительно проясняет для меня вещи. Я изменил свой код, чтобы по существу создать строку JSON с информацией, которую я хочу, в той части, которую вы описываете как контекст страницы, а затем вернуть ее в скрипт. Я полагаю, что меня бросило в глаза то, что я получал одну строку вывода, а не какую-то ошибку... в любом случае, еще раз спасибо! 16.06.2015
  • Это все еще работает? По какой-то причине это не работает для меня. Невозможно использовать console.log() таким образом. 31.08.2016
  • @RetroCode Я не пробовал, но я просмотрел код для v2, и все еще похоже, что он должен работать именно так. Помните, что Nightmare v2 был полностью переписан с промисами и Electron вместо PhantomJS. 31.08.2016
  • @ArtjomB. Есть ли у кошмара v2 ограничение? Аргументы и возвращаемое значение функции вычисления должны быть простым примитивным объектом. Эмпирическое правило: если его можно сериализовать через JSON, то все в порядке? 17.01.2017
  • @OgrishMan Извините, я не пробовал и не знаю, как с этим справляется Electron. По сути, это было ограничение PhantomJS, а не Nightmare. 18.01.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..