Парсинг с помощью NightmareJS с NodeJS

Я пытаюсь очистить и сохранить результаты в своей базе данных. Я использую NodeJS (фреймворк Sails.js)

Это рабочий пример использования cheerio:

getRequest('some-url').then((data) => {
    const $ = cheerio.load(data);
    let title = $('.title').each(function (i, element) {
        let a = $(this);
        let title = a.text(); // Title
        MyModel.create({title : title}).exec((err, event) => {
        });
    });
});

Проблема с cheerio заключается в том, что он не действует как браузер и не отображает веб-страницы, отображаемые с помощью javascript.

Поэтому я решил попробовать кошмарный js, и это был кошмар, чтобы сделать то же самое:

var articles = [];
Promise.resolve(nightmare
    .goto('some-url')
    .wait(0)
    .inject('js', 'assets/js/dependencies/jquery-3.2.1.min.js')
    .evaluate((articles) => {
        var article = {};
        var list = document.querySelectorAll('h3 a');
        var elementArray = [...list];
        elementArray.forEach(el => {
            article.title = el.innerText;
            articles.push(article);
            myModel.create({title : article.title}).exec((err, event) => {
            });
        });
        return articles;
    }, articles)
    .end())
    .then((data) => {
        console.log(data);
    });

Проблемы

Новости не определены внутри функции evaluate(). функция оценки, похоже, принимает только строки, а Новости — это модель, созданная sails.js.

Кроме того, массив статей заполняется теми же данными.

Есть ли более простой способ очистить веб-страницу после рендеринга DOM с помощью NodeJS?


person TheUnreal    schedule 30.05.2017    source источник
comment
кошмар работает довольно хорошо для слома. Вы не можете использовать модули Nodejs внутри оценки (по крайней мере, не просто). Но вы можете передать любой json из Assessment(). В вашем случае вызовите myModel.create() в функции then(), которая имеет модули nodejs.   -  person devilpreet    schedule 23.06.2017


Ответы (1)


Во-первых, я бы отказался от использования синтаксиса Promise Chains и строго use await/async, потому что с ним проще и понятнее работать.

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

Я говорю об использовании Puppeteer от Google, имитации браузера chromium и управлении им через API, как Кошмары

Я также написал хорошее начальное руководство по парсингу с помощью Puppeteer. , я уверен, что это поможет!

person Fabian    schedule 08.01.2019