2016-01-04 19 views
7

के साथ गतिशील पेजिंग मैं नाइटमेयर/इलेक्ट्रॉन के साथ गतिशील पेजिंग वेबसाइटों को स्क्रैप करने का प्रयास कर रहा हूं। मुझे ऐसा करने का कोई तरीका नहीं दिख रहा है ... जब तक दुःस्वप्न कार्यों के साथ या तर्क के साथ कॉल का मूल्यांकन करने का एक तरीका नहीं है।नाइटमेयर/इलेक्ट्रॉन (पृष्ठ स्क्रैप)

यहां एक साधारण कोड उदाहरण है जो केवल एक वाक्यांश को गूगल्स करता है और परिणाम 1 से परिणाम hrefs देता है। मैं यह कोड परिणामों में प्रत्येक पृष्ठ के लिए जारी रखना चाहता हूं।

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

निम्न उदाहरण कोड एक solution segmentio/बुरा सपना परियोजना के rosshinkley द्वारा प्रदान का एक संशोधित संस्करण है। इसे अभी भी कुछ काम की जरूरत है क्योंकि इस बिंदु पर नाइटमेयर संस्करण 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

@ brenity के लिए TheAnimatrix उदाहरण Google द्वारा लौटाए गए प्रत्येक पृष्ठ का पहला लिंक देता है। –

+1

ठीक है मैंने सोचा कि यह एक गलती थी, लेकिन इस समाधान के साथ कोई समस्या मौजूद है, अंतिम पृष्ठ इस समस्या पर ठोकर नहीं आता है, तो उन्हें सिर्फ लिंक.push() फ़ंक्शन को कॉपी करना चाहिए जबकि लूप, तो यह अंतिम पृष्ठ की क्षतिपूर्ति के लिए एक बार और अधिक चला सकता है – TheAnimatrix

संबंधित मुद्दे