2014-12-09 4 views
0

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

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

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

Проблема:

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

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> 

ответ

0

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