Perl

CPANなどで様々なモジュールが豊富にあり、シェルスクリプトでは実装が難しい処理が比較的短いコードで可能なスクリプト言語です。




YahooFinanceから株価データを取得する

Web::Scraperモジュールを使用して、Yahoo Financeから指定した銘柄の株価データをGETするPerlスクリプトです。
2つのスクリプトで実装しました。
・ext_data.pl
標準入力で指定された Yahoo Finance の株価時系列ページのURLにアクセスして株価データだけを標準出力に表示するスクリプト。
・ext_stock.pl
スクリプト内で定義(直書き)した抽出期間と、標準入力で指定された銘柄コードから取得先のURLを生成して ext_data.pl を実行するスクリプト。
標準入力で、処理一時ファイル(第一引数)、結果ファイル(第二引数)、銘柄コード(第三引数)を指定して実行する必要があります。
結果ファイルに株価データがCSV形式で下記の順で記録されます。
"銘柄コード"、"日付"、"始値"、"高値"、"安値"、"終値"、"出来高"、"調整後終値"

実行例
$touch tmp_file
$touch res_file.txt
$perl ext_stock.pl tmp_file res_file.txt [取得したい銘柄コード(4桁)]



ext_data.pl
#!/usr/bin/perl
###########################################################################
# 標準入力で指定されたyahooファイナンスの時系列データを抜き出すスクリプト
#
# 第一引数:指定銘柄の時系列データのURL
# 第二引数:銘柄コード
#
###########################################################################

use strict;
use warnings;

use Web::Scraper;
use URI;
use Encode;

my $WebSite = $ARGV[0];
my $m_code = $ARGV[1];

# 日付、始値、高値、安値、終値、出来高、調整後終値の順
my $stock_list = scraper {
   process '//tr[@bgcolor="#ffffff"]/td[1]', "sdata[]" => 'TEXT';
   process '//tr[@bgcolor="#ffffff"]/td[2]', "svalue[]" => 'TEXT';
   process '//tr[@bgcolor="#ffffff"]/td[3]', "hvalue[]" => 'TEXT';
   process '//tr[@bgcolor="#ffffff"]/td[4]', "lvalue[]" => 'TEXT';
   process '//tr[@bgcolor="#ffffff"]/td[5]', "evalue[]" => 'TEXT';
   process '//tr[@bgcolor="#ffffff"]/td[6]', "mount[]" => 'TEXT';
   process '//tr[@bgcolor="#ffffff"]/td[7]', "fvalue[]" => 'TEXT';
};

my $res = $stock_list->scrape( URI->new($WebSite) );

my @sdata = @{$res->{sdata}};
my @svalue = @{$res->{svalue}};
my @hvalue = @{$res->{hvalue}};
my @lvalue = @{$res->{lvalue}};
my @evalue = @{$res->{evalue}};
my @mount = @{$res->{mount}};
my @fvalue = @{$res->{fvalue}};

my $length = @sdata;

# CVS形式で標準出力
for ( $_= 0; $_ < $length; $_++){
  print $m_code . ",";
  print encode('utf-8',$sdata[$_]), ",", "\"";
  print encode('utf-8',$svalue[$_]), "\"", ",", "\"";
  print encode('utf-8',$hvalue[$_]), "\"", ",", "\"";
  print encode('utf-8',$lvalue[$_]), "\"", ",", "\"";
  print encode('utf-8',$evalue[$_]), "\"", ",", "\"";
  print encode('utf-8',$mount[$_]), "\"", ",", "\"";
  print encode('utf-8',$evalue[$_]), "\"", "\n";
}




ext_stock.pl
#!/usr/bin/perl
##############################################################
#  Yahooファイナンスから株価時系列データを取得するスクリプト
#
# 第一引数:一時ファイル名
# 第二引数:結果ファイル名
# 第三引数:銘柄コード
#
##############################################################

use strict;
use warnings;
use Encode;

my $start_y = 2011;   # 取得開始年
my $start_m = 7;      # 取得開始月
my $start_d = 15;     # 取得開始日

my $end_y = 2011;     # 取得終了年
my $end_m = 7;        # 取得終了月
my $end_d = 15;       # 取得終了日

my $tmp_file = $ARGV[0]; # 一時ファイル
my $res_file = $ARGV[1]; # 結果ファイル
my $m_code = $ARGV[2];    # 取得銘柄コード

my $page_c = 0;       # 時系列ページ数(50ずつインクリメントさせる)
my $tmp;              # 個別の銘柄データを一時的に格納する変数
my @lines;
my $length;

# YahooFinanceの時系列データのURL
my $yf_url = "\"" . "http://table.yahoo.co.jp/t?s=" . $m_code . "&a=" . $start_m . "&b=" . $start_d . "&c=" . $start_y . "&d=" . $end_m . "&e=" . $end_d ."&f=" . $end_y . "&g=d&q=t&y=" . $page_c . "&z=" . $m_code . "&x=.csv" . "\"";


#print $m_code . "の時系列データを取得します。\n";
#print $yf_url . "\n";


# 一時ファイルの中身をクリア
open (OUT, "> $tmp_file") or die "$!";
   print OUT "";
close(OUT);

# 時系列データを取得する
$tmp = `perl ext_data.pl $yf_url $m_code`;

# 50件の時系列データを一時格納
open (OUT, ">> $tmp_file") or die "$!";
   print OUT $tmp;
close(OUT);


# 取得レコード数チェック
open (CSV_FILE,"$tmp_file");
  @lines = <CSV_FILE>;
close(CSV_FILE);
$length = @lines;
#print $length . "\n";

if ($length > 0) {

  # 時系列データを格納
  open (OUT, ">> $res_file") or die "$!";
     print OUT $tmp;
  close(OUT);

  # 50レコード以上ある場合のデータ取得処理
  # (Yahoo Financeは1ページは50個単位でデータを表示する)
  while ($length > 49) {
    $page_c = $page_c + 50;
    $yf_url = "\"" . "http://table.yahoo.co.jp/t?s=" . $m_code . "&a=" . $start_m . "&b=" . $start_d . "&c=" . $start_y . "&d=" . $end_m . "&e=" . $end_d ."&f=" . $end_y . "&g=d&q=t&y=" . $page_c . "&z=" . $m_code . "&x=.csv" . "\"";
  
    ## print $yf_url . "\n";

    # 一時ファイルの中身をクリア
    open (OUT, "> $tmp_file") or die "$!";
       print OUT "";
    close(OUT);

    # 時系列データを取得する
    $tmp = `perl ext_data.pl $yf_url $m_code`;

    # 50件の時系列データを一時格納
    open (OUT, ">> $tmp_file") or die "$!";
       print OUT $tmp;
    close(OUT);
 
    # 取得レコード数チェック
    open (CSV_FILE,"$tmp_file");
      @lines = <CSV_FILE>;
    close(CSV_FILE);
    $length = @lines;
    ## print $length . "\n";
  
    # 時系列データを格納
    open (OUT, ">> $res_file") or die "$!";
       print OUT $tmp;
    close(OUT);
    
  }
  #print $m_code . "の取得完了\n";
}





g++のインストール手順

Perlモジュールをインストール時などで"g++"がないというエラーが出た場合は、"gcc-c++"をインストールする必要がある。

#perl -MCPAN -e shell
#cpan> install gcc-c++
#       略
#cpan>quit


最終更新:2011年07月24日 08:48
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。