2016-01-04 9 views
7

ナイトメア/エレクトロンでダイナミックページングWebサイトをスクラップしようとしています。私は、悪夢の関数や論理を使って呼び出しを評価する連鎖を行うまでdoを実行する方法は見当たりません。ナイトメア/エレクトロン(ページスクレイプ)を使用した動的ページング

ここでは、単にフレーズをゴーグルし、結果のページを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); 
}); 

答えて

5

次のコード例は、segmentio /悪夢プロジェクトのrosshinkleyによって提供solutionの修正版です。これは、ナイトメアバージョン2.1.2でこの時点で私のテストから100%信頼できるものではないので、まだいくつかの作業が必要ですが、優れた出発点です。

注:テストを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(); 
} 
+0

なぜリンク[0]、なぜ最初のリンクのみですか? – TheAnimatrix

+0

@TheAnimatrix簡潔にするために、この例ではgoogleから返された各ページの最初のリンクを返します。 –

+1

申し訳ありませんが、間違いだと思っていましたが、この解決策に問題があります。誰かがこの問題に遭遇した場合、最後のページには傷がつかないので、links.push()関数をループしているので、もう一度実行して最後のページを補うことができます – TheAnimatrix

関連する問題