2016-01-04 13 views
7

Sto tentando di analizzare siti Web di paging dinamici con Nightmare/Electron. Non vedo un modo per eseguire un do ... fino a quando funzioni da incubo O un modo per concatenare le chiamate con la logica.Cercapersone dinamico con Nightmare/Electron (page scrap)

Ecco un semplice esempio di codice che si limita a Googles una frase e restituisce gli hrefs di risultati dalla pagina 1. Mi piacerebbe che questo codice continuasse per ogni pagina nei risultati.

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); 
}); 

risposta

5

Il seguente esempio di codice è una versione modificata di una solution fornito dal rosshinkley del progetto segmentio/incubo. Questo ha ancora bisogno di un po 'di lavoro in quanto non è affidabile al 100% dai miei test a questo punto con la versione 2.1.2 di Nightmare ma è un ottimo punto di partenza.

Nota: quando esegui il test se lo esegui più di X volte, Google richiede un captcha.

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(); 
} 
+0

che cosa è con i collegamenti [0], perché solo il primo collegamento? – TheAnimatrix

+0

@ TheAnimatrix per brevità l'esempio restituisce il primo collegamento di ogni pagina restituito da google. –

+1

ok ho pensato che fosse un errore di sorta, ma esiste un problema con questa soluzione, l'ultima pagina non viene grattata, se qualcuno si imbatte in questo problema allora dovrebbe semplicemente copiare la funzione links.push() all'esterno while loop, quindi può essere eseguito ancora una volta per compensare l'ultima pagina – TheAnimatrix