2016-08-24 4 views
0

NightmareJSを初めて使い、ウェブサイトをスクラップするためのスクリプトを書いています。 これはそのように機能します。私は自分のプロフィールにログインし、サイトが読み込まれるのを待ってから、自分の好きなプロフィールに行きます。そこで、私はサイトの終わりまでスクロールします。現時点で私はこの種の醜い作業を使用し、すべての結果を得るためにページの一番下までスクロールして次のステップに進む方法があるのだろうかと思います。ナイトメアのレイジーロードスクロールJS

var Nightmare = require('nightmare'); 
var vo = require('vo'); 
vo(run)(function(err, result) { 
    if (err) throw err; 
}); 
function *run() { 
    var nightmare = Nightmare({ show: true, 
          webPreferences: { partition: 'your-custom-partition'}}); 
    yield nightmare 
    .goto('https://facebook.com/login') 
    .type('input[id="email"]', "user") 
    .type("input[id='pass']", "pass") 
    .click('#loginbutton') 
    .wait('._8u._42ef') 
    .goto('https://www.facebook.com/myprofile/likes') 
    .wait(1000) 
    yield nightmare 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
     .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
     .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
     .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    .evaluate(function() { 
     window.document.body.scrollTop = document.body.scrollHeight; 
    }) 
    .wait(3000) 
    var title = yield nightmare 
    .evaluate(function() { 
       var jsonObject = new Array(''); 
       var links = document.getElementsByClassName("_5rz _5k3a _5rz3 _1v6c"); 
       var numProfiles = links.length; 
       for(var i = 0; i< numProfiles; i++){ 
       var elem; 
       elem = links[i].querySelector(".fsl.fwb.fcb a").href; 
       console.log(elem); 
       jsonObject.push(elem); 
       } 
       if(numProfiles > 0) { 
       //then delete that element, so we don't overlaod the page 
       for(var j = 0; j < numProfiles; j++){ 
       links[0].parentNode.removeChild(links[0]); 
       } 
       window.document.body.scrollTop = document.body.scrollHeight; 
       } 
       return jsonObject; 
    }); 
    console.log(title); 
    yield nightmare.end(); 
} 

答えて

1

は、私が何を後にしていることsegmentio/nightmare#625に関連しているthis answerに似たもの、だと思います。

完全性のために、参照されている回答に記載されているソリューションのコピーが以下に含まれています。

var Nightmare = require('nightmare'); 
var vo = require('vo'); 
var nightmare = Nightmare({ 
    show: true 
}); 

var run = function *() { 
    yield nightmare.goto('http://someInfiniteScrollPage.tld'); 

    var previousHeight, currentHeight=0; 
    while(previousHeight !== currentHeight) { 
    previousHeight = currentHeight; 
    var currentHeight = yield nightmare.evaluate(function() { 
     return document.body.scrollHeight; 
    }); 
    yield nightmare.scrollTo(currentHeight, 0) 
     .wait(3000); 
    } 
    yield nightmare.end(); 
}; 

vo(run)(function(err) { 
    console.dir(err); 
    console.log('done'); 
}); 

このアプローチには問題があります:あなたはactually is an infinite scrollというページに逆行しているとき、上記終わることは決してありません


この

は、あなたの質問に答えるために 非常にナイーブ方法です。また、 .wait()コールは、スクロール要素のカウントが潜在的に待ち時間を短縮し、堅牢性を高めるために変化するのを待つことに置き換えることができる。それでも、これはあなたを始めさせるのに十分なはずです。

+0

ありがとう、多くの仲間、それは素晴らしい解決策です。これまでになかった要素を検出する方法と、次のブロックに進むトリガーとなるヒントはありますか? – Saibottrenham

関連する問題