2016-03-30 12 views
0

Ich habe Schwierigkeiten, eine casperjs auf die nächste Seite zu bewegen, nachdem rekursiv durch die Links auf der Seite gearbeitet hat.Scrapping Daten von angeklickt Links auf der Seite, dann auf die nächste Seite und wiederholen in CasperJS

Ich kann es bekommen, um Daten von jeder Seite zu nehmen und durch die Seiten zu gehen, oder klicke auf jeden Link auf einer Seite, aber ich bekomme es nicht beides.

var utils = require('utils'); 
var x = require('casper').selectXPath; 

var casper = require('casper').create({ 
    verbose: true, 
    logLevel: 'error', 
    waitTimeout: 10000, 
    pageSettings: { 
    loadImages: false, 
    loadPlugins: false, 
    userAgent: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36  (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36' 
    } 
}); 

var currentPage = 1; 
var i = 0; 
var links = []; 
var link_titles = []; 


var terminate = function() { 
    this.echo("Exiting..").exit(); 
}; 

function getSelectedPage() { 
    var el = document.querySelector('td.cur'); 
    return parseInt(el.textContent); 
} 

function getPageLinks() { 
    var links = document.querySelectorAll('h3.r a'); 
    return [].map.call(links, function(link) { 
    return link.getAttribute('href'); 
    }); 
} 


function getLinkData(link) { 
    this.thenOpen(link, function() { 


    var title = this.getTitle(); 


    // Add the data from link 
    var data = { 
     title: title, 
    }; 
    link_titles.push(data); 

    }); 
} 

function loopThroughLinks() { 

if(i < links.length) { 
    this.echo('[LINK #' + i + '] '+ links[i]); 
    getLinkData.call(this, links[i]); 
    i++; 
    this.run(loopThroughLinks); 

} else { 
    utils.dump(link_titles); 
    }  
} 


function linkData(){ 
    links = this.evaluate(getPageLinks); 
    this.run(loopThroughLinks); 
} 


var processPage = function() { 

    this.run(linkData); 

    //PROBLEM EXISTS BELOW HERE - IF YOU COMMENT OUT FROM HERE IT RUNS AS EXPECTED FOR THE FIRST PAGE 
    //WITH CODE BELOW INCLUDED, SKIPS this.run(linkData) AND JUST GOES THROUGH PAGES; 
    this.then(function(){ 

    if (currentPage >= 3) { 
     return terminate.call(casper); 
    } 

    currentPage++; 

    this.echo("requesting next page: " + currentPage); 
    this.capture("google-results-p" + currentPage + ".png"); 

    this.thenClick('a.pn span').then(function(){ 
     this.waitFor(function(){ 
      return currentPage === this.evaluate(getSelectedPage); 

     }, processPage, terminate); 
    }); 
    }); //COMMENT OUT TO HERE FOR WORKING ONE PAGE VERSION 
} 


casper.start('https://www.google.co.uk/?gws_rd=ssl#q=casperjs'); 

casper.run(processPage); 

Aktualisierter Code für mehrere Aufrufe von Aufrufen. Jetzt die erste Seite korrekt durchlaufen, aber die Ergebnisse von der ersten Seite für alle anderen Seiten drucken?

var utils = require('utils'); 
var x = require('casper').selectXPath; 

var casper = require('casper').create({ 
    verbose: true, 
    logLevel: 'error', 
    waitTimeout: 10000, 
    pageSettings: { 
    loadImages: false, 
    loadPlugins: false, 
    userAgent: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36' 
    } 
}); 

var currentPage = 1; 
var i = 0; 
var links = []; 
var link_titles = []; 


var terminate = function() { 
    this.echo("Exiting..").exit(); 
}; 

function getSelectedPage() { 
    var el = document.querySelector('td.cur'); 
    return parseInt(el.textContent); 
} 

function getPageLinks() { 
    var links = document.querySelectorAll("h3.r a"); 
    return Array.prototype.map.call(links, function(e) { 
     try { 
      // google handles redirects hrefs to some script of theirs 
      return (/url\?q=(.*)&sa=U/).exec(e.getAttribute("href"))[1]; 
     } catch (err) { 
      return e.getAttribute("href"); 
     } 
    }); 
} 

function getLinkData(link) { 
    this.thenOpen(link, function() { 

    //var title = this.fetchText('title'); 
    var title = this.getTitle(); 


    // Add the staff data from link 
    var data = { 
     title: title, 
    }; 
    link_titles.push(data); 

    this.then(function(){ ///ADDED - BACK TO RIGHT PAGE FOR SELECTOR 
    this.back(); 
    }); 

    }); 
} 

function loopThroughLinks() { 

if(i < links.length) { 
    this.echo('[LINK #' + i + '] '+ links[i]); 
    getLinkData.call(this, links[i]); 
    i++; 
    this.then(loopThroughLinks); 

} else { 
    utils.dump(link_titles); 
    }  
} 


function linkData(){ 
    links = this.evaluate(getPageLinks); 
    this.then(loopThroughLinks); 
} 


var processPage = function() { 

    this.wait(2000, function(){ 
    this.then(linkData); 
    }); 


    this.wait(2000, function(){ 
    this.then(function(){ 

    if (currentPage >= 3) { 
     return terminate.call(casper); 
    } 


    this.echo("requesting next page: " + currentPage); 
    this.capture("google-results-p" + currentPage + ".png"); 


    currentPage++; 


    this.thenClick('a.pn span').then(function(){ 
     this.capture('google-results-2-p' + currentPage + '.png'); 
     this.waitFor(function(){ 
      return currentPage === this.evaluate(getSelectedPage); 

     }, processPage, terminate); 
    }); 
    }); 
}); 
} 


casper.start('https://www.google.co.uk/?gws_rd=ssl#q=casperjs'); 

casper.then(processPage); 

casper.run(); 

Antwort

0

Sie haben nur einen casper.run() (und nur eine casper.start()) Aufruf haben. run() startet die CasperJS-Schrittwarteschlange und beendet die Ausführung, wenn keine weiteren Schritte folgen. Der einzige Anruf, der bleiben muss, ist casper.run(processPage);, aber alle anderen this.run(...) Anrufe müssen in this.then(...) geändert werden.

+0

Vielen Dank für Ihre Antwort/Hilfe. Das macht Sinn. Wenn ich das obige getan habe, wenn ich casper.run (processPage) belasse, tut es nichts und wechselt zu casper.start (...), casper.then (processPage); casper.run(), es wird die erste Seite ausgeführt, dann wird die nächste Seite wiederholt, aber gestoppt. Auf jeden Fall in die richtige Richtung! Ich werde wieder ein Stück spielen, aber wenn Sie irgendwelche Ideen haben, würde es sehr geschätzt werden. Nochmals vielen Dank, dass Sie sich die Zeit genommen haben, zu antworten. :) –

+0

Es läuft jetzt durch die Links der ersten Seite, druckt dann die Ergebnisse von Links, durchläuft dann die Seiten und druckt die Ergebnisse für die Links von Seite 1 für jede Seite !!! d. h. keine p2-Links, p3-Links usw. durchlaufen. –

+0

Was zeigen Ihnen die Screenshots? –