Web scraping 如何使用casperjs从提供的网站上刮表?

Web scraping 如何使用casperjs从提供的网站上刮表?,web-scraping,casperjs,Web Scraping,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 = functi

最终的目标是从提供的经纪人网站中以表格形式检索股票数据,并将其保存到某个文本文件中。以下是代码,我通过阅读几篇教程编译了这些代码:

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();
var casper=require(“casper”).create();
var url='1〕https://iqoption.com/en/historical-financial-quotes?active_id=1&tz_offset=60&date=2016-12-19-21-59';
var terminate=function(){
this.echo(“退出…”)。exit();
};
var processPage=函数(){
var rows=document.querySelectorAll('#mCSB_3_container>table');//从代理站点获取表(通过chrome工具中的复制选择器复制/粘贴)
//var nodes=document.getElementsByClassName('mCSB_容器');
这个.echo(行);
this.echo(rows.length);
对于(变量i=0;i

此代码应检索股票价格表并打印出每个单元格。然而,我得到的只是“未定义”,这可能意味着我没有得到queryselector调用返回的对象。请假设我不懂任何web编程(HTML、CSS)。

首先,问题是waitFor设置得不太好,您必须等待行/单元格
您在本页上看到的节点有点关联,如果有人得到一个更抽象的解决方案,其中ChildNodes的处理更好,那么在我的解决方案中,我会非常感兴趣:

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();
var casper=require('casper').create();
var url='1〕https://eu.iqoption.com/en/historical-financial-quotes?active_id=1&tz_offset=60&date=2016-12-19-21-59';
变异长度;
casper.start(url);
casper.then(函数(){
这个.waitForSelector(“#mCSB_3_container table tbody tr”);
});
函数getCellContent(行、单元格){
cellText=casper.evaluate(函数(行,单元格){
返回文档.querySelectorAll('table tbody tr')[row].childNodes[cell].innerText.trim();
},行,单元格);
返回单元格文本;
}
casper.then(函数(){
var rows=casper.evaluate(函数(){
返回文档.querySelectorAll('table tbody tr');
});
长度=行数。长度;
这个.echo(“表格长度:+长度”);
});
//这部分可以做得更好,但这是它应该工作的方式。。。
casper.then(函数(){
对于(变量i=0;i
我有两个问题:首先,打印一个简单的表格大约需要80秒,这太长了,大部分时间都花在了最后一步上(需要不到几秒的时间才能获得在chrome中呈现的相同数据)。其次,如果我修改脚本并批量运行多个页面以一次获得多个表,就会出现“内存耗尽”错误,因为我的RAM不足(有2GB可用内存)。