Динамическое пейджинг с помощью Nightmare / Electron (очистка страницы)

Я пытаюсь очистить веб-сайты с динамическим пейджингом с помощью Nightmare / Electron. Я не вижу способа выполнить действие... до тех пор, пока не появятся кошмарные функции ИЛИ способ связать оценочные вызовы с логикой.

Вот простой пример кода, который просто ищет фразу в Google и возвращает результат hrefs со страницы 1. Я хотел бы, чтобы этот код продолжался для каждой страницы в результатах.

var Nightmare = require('nightmare');
var vo = require('vo');

vo(function* () {
  var nightmare = Nightmare({ show: true });
  var links = yield nightmare
    .goto('http://www.google.com')
    .wait('input[title="Search"]')
    .click('input[title="Search"]')
    .type('input[title="Search"]', 'Anequim Project')
    .click('input[name="btnK"]')
    .wait(600)
    .evaluate(function(){
        var linkArray = [];
        var links = document.querySelectorAll('h3.r a');
        for (var i = 0; i < links.length; ++i) {
            linkArray.push(links[i].getAttribute('href'));
        }
        return linkArray;
    });
  yield nightmare.end();
  return links;
})(function (err, result) {
  if (err) return console.log(err);
  console.log(result);
});

person Stan Smith    schedule 04.01.2016    source источник


Ответы (1)


Следующий пример кода представляет собой модифицированную версию решения, предоставленного rosshinkley из группы segmentio/nightmare. проект. Это все еще нуждается в некоторой доработке, так как это не на 100% надежно по моим тестам с Nightmare версии 2.1.2, но это отличная отправная точка.

Примечание. При тестировании, если вы запустите его более X раз, Google потребует ввести капчу.

var Nightmare = require('nightmare');
var vo = require('vo');

vo(run)(function(err, result) {
    if (err) throw err;
});

function* run() {
    var nightmare = Nightmare({ show: true }), 
        MAX_PAGE = 100, 
        currentPage = 0, 
        nextExists = true, 
        links = []; 

    yield nightmare 
        .goto('http://www.google.com')
        .wait('input[title="Search"]')
        .click('input[title="Search"]')
        .type('input[title="Search"]', 'Anequim Project')
        .click('input[name="btnK"]') 
        .wait(2000)

    nextExists = yield nightmare.visible('#pnnext'); 

    while (nextExists && currentPage < MAX_PAGE) { 
        links.push(yield nightmare 
            .evaluate(function() { 
                var linkArray = [];
                var links = document.querySelectorAll('h3.r a');
                return links[0].href; 
            })); 

        yield nightmare 
            .click('#pnnext')
            .wait(2000)

        currentPage++; 
        nextExists = yield nightmare.visible('#pnnext'); 
    } 

    console.dir(links); 
    yield nightmare.end(); 
} 
person Stan Smith    schedule 05.01.2016
comment
что со ссылками[0], почему только первая ссылка? - person TheAnimatrix; 02.05.2016
comment
@TheAnimatrix для краткости пример возвращает первую ссылку каждой страницы, возвращаемой Google. - person Stan Smith; 06.05.2016
comment
хорошо, я думал, что это своего рода ошибка, но существует проблема с этим решением, последняя страница не очищается, если кто-то наткнется на эту проблему, им следует просто скопировать функцию links.push() за пределы времени loop , чтобы он мог запуститься еще раз, чтобы компенсировать последнюю страницу - person TheAnimatrix; 06.05.2016