Как загрузить данные о ценах на акции, только если они не ошибочны (404)?

Скрипт загружает исторические котировки акций с сайта Finance.yahoo.com. Массив тикеров используется для циклического прохождения скрипта, создания ссылок на основе массива тикеров и загрузки данных, связанных с каждым тикером. Однако некоторые символы тикера больше не актуальны, и в результате Yahoo предоставляет страницу 404 вместо csv, содержащего информацию о цене. Вместо этого страница с ошибкой сохраняется в формате csv и сохраняется на моем компьютере. Чтобы не загружать эти файлы, я ищу строку «Извините, запрошенная вами страница не найдена», которая содержится на каждом из сайтов с ошибками yahoos в качестве индикатора страницы 404.

Поведение кода (вывод, см. код ниже):

Код проходит через все тикеры и загружает все цены акций в формате .csv. Это прекрасно работает для всех тикеров, но некоторые символы тикера больше не используются Yahoo. В случае тикера, который больше не используется, программа загружает .csv, содержащий страницу Yahoos 404. Все файлы (в том числе и хорошие, содержащие актуальные данные) скачиваются в директорию c:\Users\W7ADM\stock-price-leecher\data2.

Проблема:

Я хотел бы, чтобы код не загружал страницу 404 в файл csv, а просто ничего не делал в этом случае и переходил к следующему символу тикера в цикле. Я пытаюсь добиться этого с помощью условия if, которое ищет строку «Извините, запрошенная вами страница не найдена». это отображается на yahoos 404-страницах. В конце концов, я надеюсь загрузить все CSV-файлы для тикеров, которые на самом деле существуют, и сохранить их на свой жесткий диск.

var url_begin = 'http://real-chart.finance.yahoo.com/table.csv?s=';
var url_end = '&a=00&b=1&c=1950&d=11&e=31&f=2050&g=d&ignore=.csv';
var tickers = [];
var link_created = '';

var casper = require('casper').create({
    pageSettings: {
        webSecurityEnabled: false
    }
});                   

casper.start('http://www.google.de', function() {              
        tickers = ['ADS.DE', '0AM.DE']; //ADS.DE is retrievable, 0AM.DE is not
        //loop through all ticker symbols
        for (var i in tickers){
                //create a link with the current ticker
                link_created=url_begin + tickers[i] + url_end;
                //check to see, if the created link returns a 404 page
                this.open(link_created);
                var content = this.getHTML();
                //If is is a 404 page, jump to the next iteration of the for loop
                if (content.indexOf('Sorry, the page you requested was not found.')>-1){
                        console.log('No Page found.');
                        continue; //At this point I want to jump to the next iteration of the loop.
                }
                //Otherwise download file to local hdd
                else {
                        console.log(link_created);
                        this.download(link_created, 'stock-price-leecher\\data2\\'+tickers[i]+'.csv');
                }
        }
});

casper.run(function() {
        this.echo('Ende...').exit();
});

Выход:

C:\Users\Win7ADM>casperjs spl_old.js
ADS.DE,0AM.DE
http://real-chart.finance.yahoo.com/table.csv?s=ADS.DE&a=00&b=1&c=1950&d=11&e=31
&f=2050&g=d&ignore=.csv
http://real-chart.finance.yahoo.com/table.csv?s=0AM.DE&a=00&b=1&c=1950&d=11&e=31
&f=2050&g=d&ignore=.csv
Ende...

C:\Users\Win7ADM>

person jonas778    schedule 09.12.2014    source источник


Ответы (1)


casper.open является асинхронным (неблокирующим), но вы используете его блокирующим образом. Вы должны использовать casper.thenOpen, у которого есть обратный вызов, который вызывается при загрузке страницы, и вы можете что-то с ним делать.

casper.start("http://example.com");

tickers = ['ADS.DE', '0AM.DE']; //ADS.DE is still retrievable, 0AM.DE is not
tickers.forEach(function(ticker){
    var link_created = url_begin + ticker + url_end;
    casper.thenOpen(link_created, function(){
        console.log("open", link_created);
        var content = this.getHTML();
        if (content.indexOf('Sorry, the page you requested was not found.') > -1) {
            console.log('No Page found.');
        } else {
            console.log("downloading...");
            this.download(link_created, 'test14_'+ticker+'.csv');
        }
    });
});

casper.run();

Вместо использования обратного вызова thenOpen вы также можете зарегистрироваться на событие page.resource.received и специально загрузить его, проверив статус. Но теперь у вас не будет доступа к ticker, поэтому вам придется либо хранить его в глобальной переменной, либо анализировать из resource.url.

var i = 0;
casper.on("page.resource.received", function(resource){
    if (resource.stage === "end" && resource.status === 200) {
        this.download(resource.url, 'test14_'+(i++)+'.csv');
    }
});

casper.start("http://example.com");

tickers = ['ADS.DE', '0AM.DE']; //ADS.DE is still retrievable, 0AM.DE is not
tickers.forEach(function(ticker){
    var link_created = url_begin + ticker + url_end;
    casper.thenOpen(link_created);
});

casper.run();

Я не думаю, что вы должны делать это с open или thenOpen. Это может работать на PhantomJS, но, вероятно, не на SlimerJS.


Я на самом деле попробовал это, и ваша страница странна тем, что загрузка не удалась. Вы можете загрузить какую-нибудь фиктивную страницу, например example.com, загрузить файлы csv самостоятельно, используя __utils__.sendAJAX (он доступен только из контекста страницы) и write их с помощью модуля fs. Вы должны написать его только на основе определенного текста страницы с ошибкой 404, который вы определили:

casper.start("http://example.com");

casper.then(function(){
    tickers = ['ADS.DE', '0AM.DE']; //ADS.DE is still retrievable, 0AM.DE is not
    tickers.forEach(function(ticker){
        var link_created = url_begin + ticker + url_end;
        var content = casper.evaluate(function(url){
            return __utils__.sendAJAX(url, "GET");
        }, link_created);
        console.log("len: ", content.length);
        if (content.indexOf('Sorry, the page you requested was not found.') > -1) {
            console.log('No Page found.');
        } else {
            console.log("writing...");
            fs.write('test14_'+ticker+'.csv', content);
        }
    });
});

casper.run();
person Artjom B.    schedule 09.12.2014