2016-01-04 15 views
7

Dinamik çağrı sitelerini Nightmare/Electron ile kazımaya çalışıyorum. Bir kabus görmenin bir yolunu görmüyorum ... kabus fonksiyonlarına VEYA zincire bir çağrı mantığı ile çağrıları değerlendirene kadar.Kabus/Elektron ile dinamik sayfalama (sayfa kazıma)

Basit bir kod örneği, yalnızca bir deyimi Googles ve sonuç sayfalarını sayfa 1'den döndürür. Bu kodun sonuçlardaki her sayfa için devam etmesini istiyorum.

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

cevap

5

Aşağıdaki kod örneği segmentio/kabus proje rosshinkley tarafından sağlanan bir solution modifiye edilmiş bir versiyonudur. Bu, hala bu noktada testlerimden% 100 güvenilir değildir, çünkü bu noktada Kabus sürümü 2.1.2 ile mükemmel bir başlangıç ​​noktasıdır.

Not: Bunu X kez çalıştırdığınızda test ettiğinizde Google bir captcha gerektirecektir.

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

Bağlantılar [0] ile neden, neden sadece ilk bağlantı? – TheAnimatrix

+0

@ TheAnimatrix kısaltması için örnek, google tarafından döndürülen her sayfanın ilk bağlantısını döndürür. –

+1

tamam ben bir çeşit bir hata olduğunu düşündüm, ama bu çözüm ile bir sorun var, son sayfa, bu konu üzerine tökezlerse, o zaman onlar sadece links.push() işlevi dışında kopyalamak gerekir döngüde iken, son sayfayı telafi etmek için bir kez daha çalışabilir – TheAnimatrix