2016-12-21 1 views
1

Das endgültige Ziel besteht darin, Bestandsdaten in Tabellenform von der bereitgestellten Broker-Website abzurufen und in einer Textdatei zu speichern. Hier ist der Code, dass ich durch das Lesen paar Tutorials bisher kompilieren verwaltet:Wie scrape Tabelle von der bereitgestellten Website mit Casperjs?

var casper = require("casper").create(); 
var url = 'https://iqoption.com/en/historical-financial-quotes?active_id=1&tz_offset=60&date=2016-12-19-21-59'; 

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

var processPage = function() { 

    var rows = document.querySelectorAll('#mCSB_3_container > table'); //get table from broker site (copy/paste via copy selector in chrome tools) 
    //var nodes = document.getElementsByClassName('mCSB_container'); 

    this.echo(rows); 
    this.echo(rows.length); 
    for (var i = 0; i < rows.length; i++) 
    { 
     var cell = rows[i].querySelector('.quotes-table-result__date'); 
     this.echo(cell); //print each cell 
    } 

}; 

casper.start(url); 
casper.waitForSelector('#mCSB_3_container', processPage, terminate); 
casper.run(); 

Dieser Code sollte den Aktienkurs Tabelle abrufen und jede Zelle ausdrucken. Alles, was ich bekomme, ist jedoch 'undefiniert', was bedeutet, dass ich wahrscheinlich keine Objekte durch einen Query-Selector-Aufruf zurückgegeben habe. Und bitte gehen Sie davon aus, dass ich keine Webprogrammierung (HTML, CSS) kenne.

Antwort

1

Zunächst einmal, auf ein Problem ist, dass die WaitFor nicht so gut eingestellt war, müssen Sie auf die Zeilen/Zellen warten.
Die Knoten, die Sie auf dieser Seite raus sind ein wenig verdrahtet, wenn jemand eine abstraktere Lösung kam, wo Childnodes besser gehandhabt werden, dass ich in meiner Lösung wirklich interessieren würde:

var casper = require('casper').create(); 
var url = 'https://eu.iqoption.com/en/historical-financial-quotes?active_id=1&tz_offset=60&date=2016-12-19-21-59'; 
var length; 

casper.start(url); 

casper.then(function() { 
    this.waitForSelector('#mCSB_3_container table tbody tr'); 
}); 

function getCellContent(row, cell) { 
    cellText = casper.evaluate(function(row, cell) { 
     return document.querySelectorAll('table tbody tr')[row].childNodes[cell].innerText.trim(); 
    }, row, cell); 
    return cellText; 
} 

casper.then(function() { 
    var rows = casper.evaluate(function() { 
     return document.querySelectorAll('table tbody tr'); 
    }); 
    length = rows.length; 
    this.echo("table length: " + length); 
}); 

// This part can be done nicer, but it's the way it should work ... 
casper.then(function() { 
    for (var i = 0; i < length; i++) { 
     this.echo("Date: " + getCellContent(i, 0)); 
     this.echo("Bid: " + getCellContent(i, 1)); 
     this.echo("Ask: " + getCellContent(i, 2)); 
     this.echo("Quotes: " + getCellContent(i, 3)); 
    } 
}); 

casper.run(); 
+0

ich zwei Probleme: Erstens Um eine einfache Tabelle auszudrucken, dauert es etwa 80 Sekunden, was viel zu lang ist und die meiste Zeit im letzten Schritt verbracht wird (weniger als ein paar Sekunden sind nötig, um die gleichen Daten in Chrome zu erhalten). Und zweitens, wenn ich das Skript ändere und es für mehrere Seiten benutze, um mehrere Tabellen gleichzeitig zu erhalten, bekomme ich den "Speicher erschöpft" -Fehler, da ich keinen RAM mehr hatte (es sind 2GB frei). –