#!/usr/bin/perl -w
use strict ;
use LWP::Simple ;
my @urls = (
# 合同フリーハンデ3歳(1〜4)
'http://www.keibabook.co.jp/homepage/fh03_1.html',
'http://www.keibabook.co.jp/homepage/fh03_2.html',
'http://www.keibabook.co.jp/homepage/fh03_3.html',
'http://www.keibabook.co.jp/homepage/fh03_4.html',
# 合同フリーハンデ4歳以上(1〜7)
'http://www.keibabook.co.jp/homepage/fh04_1.html',
'http://www.keibabook.co.jp/homepage/fh04_2.html',
'http://www.keibabook.co.jp/homepage/fh04_3.html',
'http://www.keibabook.co.jp/homepage/fh04_4.html',
'http://www.keibabook.co.jp/homepage/fh04_5.html',
'http://www.keibabook.co.jp/homepage/fh04_6.html',
'http://www.keibabook.co.jp/homepage/fh04_7.html',
) ;
for my $url ( @urls ) {
my $fname = ( split '/', $url )[-1] ;
if ( head($url) ) {
print "$fname OK!\n" ;
getstore $url, "$fname" ;
} else {
print "$fname は存在しません!\n" ;
}
}
ページ( htmlファイル )が取得できたら、次は中のデータの配置などをチェックします。
#!/usr/bin/perl -w
use strict ;
my @htmls = (
'fh03_1.html', 'fh03_2.html', 'fh03_3.html', 'fh03_4.html',
'fh04_1.html', 'fh04_2.html', 'fh04_3.html', 'fh04_4.html',
'fh04_5.html', 'fh04_6.html', 'fh04_7.html',
) ;
my $outF = 'freeh.dat' ;
open OUT, ">$outF" ;
my $count = 0 ;
my @dat = () ;
for my $fn ( @htmls ) {
open DAT, $fn or die "ファイル $fn がありません。。$!\n" ;
while( <DAT> ){
chomp ;
next unless /^<(TD class="mfont" align|\/*TR)/ ;
if ( /^<TR>/ ) {
$count = 0 ;
@dat = () ;
next ;
}
if ( /^<\/TR>/ ) {
if ( $count > 14 ) {
my ( $mk, $jun, $sx, $max, $vS, $vM, $vI, $vL, $vE, $hnd,
$tdmk, $td, $una ) = @dat ;
$una =~ s/USA|IRE|GB|FR|AUS// ;
$una = substr( $una, 0, 18 ) ;
my $line = sprintf "%-18s %3d %s %3s %3s %3s %3s %3s %3s %4s %2s%s",
$una, $jun, $sx, $max, $vS, $vM, $vI, $vL, $vE, $hnd, $tdmk, $td ;
# csv 出力時は、上2行をコメントアウトして、下2行の # を外す。(例)
# my $line = join ",",
# $una, $jun, $sx, $max, $vS, $vM, $vI, $vL, $vE, $hnd, $tdmk, $td ;
print OUT $line, "\n" ;
}
$count = 0 ;
@dat = () ;
}
if ( /^<TD/ ) {
s/<\/FONT>// ;
my ( $dat ) = ( split '">|<\/', $_ )[-2] ;
$dat[$count] = $dat ;
$count++ ;
next ;
}
}
close DAT ;
}
close OUT ;
以下が上記スクリプトでの実際の出力です。ディープインパクト 1 L 126 120 126 120 68.0 T カネヒキリ 2 I 119 117 119 64.5 #d インティライミ 3 L 118 118 64.0 T アドマイヤジャパン 4 E 116 113 110 116 63.0 T シーチャリオット 4 I 116 110 116 63.0 d シーザリオ 6 I 115 111 115 111 62.5 T シックスセンス 6 I 115 101 115 115 108 62.5 T 〜以下省略
(2006.01.14) フリーハンデ取得〜加工用スクリプト (リンクを切りました)
いくらか書き換えました。うまく活用 & 応用してください。(2006.05.06) フリーハンデ取得〜加工用スクリプト (リンクを切りました)
↑ 2006年4月30日修正版用。 2006.05.06 現在(2007.02.08) フリーハンデ取得〜DBM加工用スクリプト (リンクを切りました)
%hash ;
$hash{ $key } = $value ;
Perl には dbmopen という、関数があります。これは DBMファイルをハッシュに
結合する時に使います。#!/usr/bin/perl # # 馬名から血統登録番号が必要になることが万一あれば、、 # DBM ファイルのテスト。データが蓄積されていく、、 # Usage: perl una2cd.pl yymmdd # yymmdd は、UMPWファイルの年月日の部分を( 6 or 8 )桁で。 # DB名 は、umacd # umacd.dir と umacd.pag の二つのファイルが出来る。 # 以下パス等は環境に応じて書き換えること。 # 一括処理( スクリプト書換え or バッチファイル )は省略。 use strict ; my %umas ; my $dbpass = 'H:/DB' ; # ★ DBM ファイル収納場所 my $dtpass = 'H:/TDAT' ; # ★ 週データパス(UMPWファイル所在地) # ここでは、フォルダ名に西暦年が付いていると想定しているので注 my $ymd = shift @ARGV ; $ymd += 20000000 if $ymd < 10000000 ; my $yyyy = substr( $ymd, 0, 4 ) ; # 注 my $fname = "$dtpass/$yyyy/UMPW$ymd\.dat" ; # 注 dbmopen %umas, "$dbpass/umacd", 0666 or die "Can't open umacd: $!\n" ; open DAT, $fname or die " そんなファイル ${fname} はナイだよ。\n" ; while( <DAT> ) { chomp ; my ( $ucd, $bname ) = unpack '@11 A10 @46 A18', $_ ; $bname =~ s/ //g ; $umas{ $bname } = $ucd ; } close DAT ; dbmclose %umas ;どんなデータ( キー&値 )が保存されているか、少し整形して出力しましょう。test.pl
#!/usr/bin/perl
# DBM出力テスト
# Usage: perl test.pl
my $dbpass = 'H:/DB' ; # ★DBM 所在地
my $dbname = 'umacd' ; # ★DBM の名前
my %test ; # 仮のハッシュ名
my $outF = $dbname . '.dat' ; # 出力ファイル名
open OUT, ">$outF" ;
dbmopen %test, "$dbpass/$dbname", 0666 or die "Can't open DBMs: $!\n" ;
while( ( $key, $value ) = each( %test ) ) {
# print OUT "$key:$value\n" ;
printf OUT "%-18s:%s\n", $key, $value ; # 整形しています。
}
close OUT ;
dbmclose %test ;
こんな感じです。
デルマフローラ :2002100320
テイエムカリスマ :2002104853
スズランサイレンス:2003103825
ホクテンジャチクン:2002103262
..以下略
#!/usr/bin/perl
#
# フリーハンデを dbm ファイルに。# DBM ファイルのテスト。
# Usage: perl freehnd.pl
# 以下★パス等は環境に応じて書き換えること。
# DB名 は、freehnd
# 馬コードをキーにしたハッシュを作っている。
# つまり、馬コードが不明なものは除外。
use strict ;
my $dbpass = 'H:/DB' ; # ★ DBM ファイル置き場
my $dtpass = 'H:/KB_SC/html' ; # ★ フリーハンデのデータパス
my %fhd ; # 新しく作る DBM ファイル用のハッシュ
my %umcd ; # DBMファイル置き場にある 馬コードハッシュ
my @htmls = (
'fh03_1.html', 'fh03_2.html', 'fh03_3.html', 'fh03_4.html',
'fh04_1.html', 'fh04_2.html', 'fh04_3.html', 'fh04_4.html',
'fh04_5.html', 'fh04_6.html', 'fh04_7.html',
) ;
my %b2s = ( 'S' => 'S', 'M' => 'M', 'I' => 'I', 'L' => 'L','E' => 'E' ) ;
dbmopen %fhd, "$dbpass/freehnd", 0666 or die "Can't open freehnd: $!\n" ;
dbmopen %umcd, "$dbpass/umacd", 0666 or die "Can't open freehnd: $!\n" ;
my $count = 0 ;
my @dat = () ;
for my $fn ( @htmls ) {
my $file = "$dtpass/$fn" ;
open DAT, $file or die "ファイル $fn がありません。。$!\n" ;
while( <DAT> ){
chomp ;
next unless /^<(TD class="mfont" align|\/*TR)/ ;
if ( /^<TR>/ ) {
$count = 0 ;
@dat = () ;
next ;
}
if ( /^<\/TRY>/ ) {
if ( $count > 14 ) {
my ( $mk, $jun, $sx, $max, $vS, $vM, $vI, $vL, $vE, $hnd,
$tdmk, $td, $una ) = @dat ;
$una =~ s/USA|IRE|GB|FR|AUS// ; # 不要文字を削除
$una = substr( $una, 0, 18 ) ;
$sx = $b2s{$sx} ;
my $ucd = $umcd{$una} ;
my $line = sprintf "%3d%s %3s %3s %3s %3s %3s %1s%s %s",
$max, $sx, $vS, $vM, $vI, $vL, $vE, $tdmk, $td, $una ;
$fhd{$ucd} ||= $line if $ucd ;
}
$count = 0 ;
@dat = () ;
}
if ( /^<TD/ ) {
s/<\/FONT>// ;
s/ //g ;
my ( $dat ) = ( split '">|<\/', $_ )[-2] ;
$dat[$count] = $dat ;
$count++ ;
}
}
close DAT ;
}
dbmclose %fhd ;
dbmclose %umcd ;
中味を、test.pl で出力するとこんな感じです。
2002100991 :109I 109 108 109 T ローゼンクロイツ
2002107008 : 97M 97 T マチカネオーラ
2002110198 : 96M 96 T マルターズビクター
2002106139 : 90I 90 T ウインアルディート
..以下略
便利というか思ったより簡単に使えそうです。
情報取得〜DBM ファイル作成なら一本のスクリプトで書けますね。