#!/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 ファイル作成なら一本のスクリプトで書けますね。