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