web-scraping
  • casperjs
  • 2016-12-21 4 views 1 likes 
    1

    最終的な目標は、提供されたブローカーWebサイトからテーブル形式の在庫データを取得し、それを何らかのテキストファイルに保存することです。casperjsを使用して、提供されたWebサイトからテーブルを削り取るにはどうすればよいですか?

    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(); 
    

    このコードでは、株価テーブルを取得して各セルを印刷する必要があります。しかし、私が得ることはすべて「未定義」です。これは、queryselector呼び出しによって返されたオブジェクトがないことを意味します。そして、私はどのWebプログラミング(HTML、CSS)も知らないと仮定してください。

    答えて

    1

    まず、問題は、waitForがうまく設定されていないことです。行/セルを待たなければなりません。

    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

    私は2つの問題を抱えている:誰でものChildNodesが良く、私の溶液中で、私は本当に興味があるということで処理され、より抽象的なソリューションを得た場合は、このページに出る
    ノードは、ビット配線されている。まず、 1つの簡単なテーブルを印刷するには約80秒かかります。これは時間がかかり、最後のステップでほとんどの時間が費やされます(同じデータをクロムでレンダリングするには数秒以下の時間がかかります)。次に、スクリプトを修正し、複数のページを一度に複数のページで実行するバッチを実行すると、RAMが不足しているため(2GBの空き容量があるため)、「メモリが枯渇しました」というエラーが表示されます。 –

    関連する問題