JRA IPAT 単勝オッズの取り込み RSSフィード
 


挨拶・自己紹介:失敗続きのAB型の変わり者 三流プログラマー Ken3です。
(※[三流君 三流プログラマーとは?自己紹介や経歴ほか])

Ken3のひとりグループです
・[ken3独りグループのトップページ]へ戻る
・独り言の[掲示板を覗く]
・勝手に作成した[キーワード一覧]を見る
・いつまでも[ken3memo下書き日記]を見る
(一人寂しくグループウェアを使っていたり....(笑))


リスト表示 | ツリー表示

1ken3memoken3memo   JRA IPAT 単勝オッズの取り込み

JRA IPAT で オッズの情報を取得する

事前準備、手作業で処理の順番 流れを確認する

事前準備、手作業で処理の順番 流れを確認する

1.複数のIEから 情報メニューを選択(画像をクリック)する

1.1 情報メニューを探す

http://ken3hitori.g.hatena.ne.jp/bbs/30/?from=1#1334371629

1.2 情報メニューを押す

http://ken3hitori.g.hatena.ne.jp/bbs/30/?from=1#1334371757

2.起動した情報メニュー(新しいIE)を操作する

http://ken3hitori.g.hatena.ne.jp/bbs/30/?from=1#1334371875

3.開催地を選択する(場所を選択し、決定を押す)

http://ken3hitori.g.hatena.ne.jp/bbs/30/?from=1#1334371968

4.オッズのボタンを押す

http://ken3hitori.g.hatena.ne.jp/bbs/30/?from=1#1334372054

5.レースの選択と種類(単勝や馬連、、3連..)を選択する

http://ken3hitori.g.hatena.ne.jp/bbs/30/?from=1#1334372146

6.決定ボタンを押す

7.表示されたオッズの表を取得する

7.1 テーブルのソースを探る

http://ken3hitori.g.hatena.ne.jp/bbs/30/?from=1#1334372354

7.2 テーブルの左上のデータで確認する 左上が枠番のテーブルを探す

http://ken3hitori.g.hatena.ne.jp/bbs/30/?from=1#1334372423

7.3 単勝のオッズをカンマ区切りで出力してみた

http://ken3hitori.g.hatena.ne.jp/bbs/30/?from=1#1334372520

8.繰り返す

8.1 1Rから最後まで 次のレースを選択 繰り返す

http://ken3hitori.g.hatena.ne.jp/bbs/30/?from=1#1334372609

8.2 開催地・競馬場単位でループさせる

http://ken3hitori.g.hatena.ne.jp/bbs/30/?from=1#1334372706


作成したソースファイル

'複数立ち上がったIEから IPAT 投票メニューを見つける

    Set objIE = getIE_URL("//www.ipat.jra.go.jp/pw_020_i.cgi")

    '見つけたかチェック
    If objIE Is Nothing Then
        wscript.Echo "エラー 投票メニューが見つかりません ログインを確認してください"
        wscript.quit
    End If   

'↑上で見つけたIPAT 投票メニューから 情報メニュー を 押す

    Call IE_A_Click(objIE, "情報メニュー")   'Aタグの 情報メニューを押す
    Set objIE = Nothing  'メニューはもう使わないので  
    WScript.Sleep  5000  '5秒待つ 1000で1秒

'次は、新しく起動した IPAT情報メインメニュー を 探す

    Set objIE = getIE_URL("//info.ipat.jra.go.jp/p/s")

    '見つけたかチェック
    If objIE Is Nothing Then
        wscript.Echo "エラー IPAT情報メインメニュー 見つかりません"
        wscript.quit
    End If   


'SELECT name=m の 開催地オプションを選択する

    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

    'ループで頭から表示してみる
    Set objM = Nothing
    For n = 0 To objSELECT.Length - 1
        '※.Nameで判断する
        If objSELECT(n).Name = "m" Then
            Set objM = objSELECT(n)  '見つけたname=mを新しくオブジェクト変数に代入
            exit For  'ループを抜ける
	End If
    Next

    Set objSELECT = Nothing  'オブジェクト変数解放

    '見つけたかチェック
    If objM Is Nothing Then
        msgbox "エラー 開催地 Name=m が 見つかりません"
        wscript.quit
    End If   

'次に下のオプションを探る 競馬場・開催地を保存する

    Dim nJYO             '開催数
    Dim strJYO_NAME(10)  '開催地名前 10もいらないけど

    Dim nR               'レース数
    Dim strR_NAME(13)    'レース 通常連番だからいらないんだけど・・・ 

    nJYO = objM.OPTIONs.Length  '数を代入
 
    '中身をループで表示
    For n = 0 To objM.OPTIONs.Length - 1
        strJYO_NAME(n) = objM.OPTIONs(n).innerTEXT  '名前を代入
    Next 

    Set objM = Nothing

'競馬場・開催地でループする。 jのループ
For j = 0 To nJYO - 1  '↑上で保存したnJYOの分だけ回る

    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

    'name=m の オプションのj番目を選択する 
    objSELECT.Item("m").OPTIONs(j).selected = True  '単純にj番目をselected Trueでセレクト状態にする

    '選択後、決定を押し、
    Call IE_INPUT_Click_VALUE(objIE, "決定")    '決定を押し、開催地を切り替える

    '表示を待つ※競馬場・開催地の切り替えを待つ
    Call IE_WAIT

'オッズのボタンを押す ※一番最初に見つかったボタンを押す(ここではレース無視)
    Call IE_INPUT_Click_VALUE(objIE, "オッズ")    'オッズを押し、表示を切り替える

'表示を待つ※オッズの切り替えを待つ
    Call IE_WAIT

'5.レース番号 と オッズの種類を覚える

    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

    nR = objSELECT.Item("s").OPTIONs.Length  'レース数を代入
 
    '中身をループで表示 レース
    For n = 0 To objSELECT.Item("s").OPTIONs.Length - 1
        strR_NAME(n) = objSELECT.Item("s").OPTIONs(n).innerTEXT  '名前を代入
    Next 

    Set objSELECT = Nothing   '一度クリアじゃないけど、キレイにする

'ループ、頭から終わりのレースまでループさせる
  For r = 0 To nR - 1  '上↑で保存したレース数分まわる

    '改めて、レースの選択 SELECTを取得する
    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")   

    'レース番号を選択
    objSELECT.Item("s").SelectedIndex = r  '上から r 番目のレースを選択
    WScript.Sleep  500  '0.5秒待ってから

    '単勝オッズを選択
    objSELECT.Item("g").Value = "Ota01"  'Ota01 固定をセット(単・複・枠連オッズ)を代入
    WScript.Sleep  500  '0.5秒待ってから

    Set objSELECT = Nothing  'オブジェクト変数解放

'6.決定を押し、レースとオッズを切り替える
    Call IE_INPUT_Click_VALUE(objIE, "決定")    '決定を押し、レースとオッズを切り替える

'表示を待つ※オッズの切り替えを待つ
    Call IE_WAIT

'7.オッズの表を取得(出力する)
    'テーブルを抜き出す

    'TABLEのタグを集める .getElementsByTagName("TABLE")を使用
    Set objTABLE = objIE.Document.getElementsByTagName("TABLE")

    'ループで頭から 中身を表示してみる
    For n = 0 To objTABLE.Length - 1
        If objTABLE(n).Rows(0).Cells(0).InnerTEXT = "枠番" Then
            Exit For  'ループを抜ける
        End If
    Next

    '↑みつけたテーブルからデータを抜きます
    '↓.Lengthで行と列を取り出し、2重ループさせる
    For y = 0 To objTABLE(n).Rows.Length - 1  '行のループ
        strLINE = ""  '空の文字列で初期化
        For x = 0 To objTABLE(n).Rows(y).Cells.Length - 1  '列のループ
            '.InnerTextで中身の文字列を取り出し &でつなげ ,カンマを付ける
            strLINE = strLINE & objTABLE(n).Rows(y).Cells(x).InnerText & ","
        Next  'テーブルの列 x の ループ
        '作成した文字列(1行分↑)を出力する
        strLINE = strR_NAME(r) & "," & strLINE  '頭にレース番号を追加する
        strLINE = strJYO_NAME(j) & "," & strLINE  '頭にレース番号を追加する 
        Wscript.ECHO strLINE    '一番後ろのゴミカンマは気にしない(ぉぃぉぃ)
    Next  'テーブルの行 y の ループ

  Next  'レース r のループ

  'メインメニューへ戻る(開催地を再選択したいので、メニューへ戻す)
  Call IE_INPUT_Click_VALUE(objIE, "メインメニュー")  'メニューを押し、表示を切り替える

  '表示を待つ※メニューの切り替えを待つ
  Call IE_WAIT

Next  '開催地・競馬場 j のループ 

'サブルーチンなど

'URLを受け取り、IEを探し、リターン値として返す
Function getIE_URL(sURL)

    'オブジェクトを格納する変数
    Dim objShell, objWindow
    Dim objRET  'リターン

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objRET = Nothing   'リターン値を初期化する    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If InStr(objWindow.document.URL, sURL) > 0 Then   'URLが含まれているか?
               Set objRET = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    Set getIE_URL = objRET     'リターン値をセット(値を返す)

End Function

'Aタグ
'oIE と クリックする文字列を受け取り、見つけたら.Click する
'(※InStrの手抜き処理なので、京都と東京都に注意 完全一致は InnerTEXTで=にする)
Sub IE_A_Click(oIE, sHTML)
    'Aのタグを集める .getElementsByTagName("A")を使用
    Set objA = oIE.Document.getElementsByTagName("A")

    'ループで頭から表示してみる
    For n = 0 To objA.Length - 1
        '※.InnerHTMLじゃなくて、.OuterHTMLでAの全体を見る
        'リンクを探す、ソースの文字を探す
        If InStr(objA(n).OuterHTML, sHTML) > 0 Then  '文字を見つけたら
            objA(n).Click  'クリックする
            Exit For  'ループを抜ける
        End If
    Next

    Set objA = Nothing  'オブジェクト変数解放
End Sub

'INPUTのタグ、.Valueで比べる
'oIE と クリックする値を受け取り、見つけたら.Click する
Sub IE_INPUT_Click_VALUE(oIE, sVALUE)
    'INPUTのタグを集める .getElementsByTagName("INPUT")を使用
    Set objINPUT = oIE.Document.getElementsByTagName("INPUT")

    'ループで頭から表示してみる
    For n = 0 To objINPUT.Length - 1
        '※.valueで値を見る
        If objINPUT(n).Value = sVALUE Then
            objINPUT(n).Click  'みつけたボタンを押す
            exit For  'ループを抜ける
	end If
    Next

    Set objINPUT = Nothing

End Sub

'IEの表示完了を待つ
Sub IE_WAIT()

    WScript.Sleep  500  '0.5秒待ってから
    
    'ページの表示完了を待ちます。
    While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
        WScript.Sleep  100  '0.1秒待つ 1000で1秒
    Wend

    WScript.Sleep  1500  '関数を抜ける前におまけで1.5秒待つ(ぉぃぉぃ)

End Sub

xxxx.vbs などに保存して、

Cscript xxxx.vbs > オッズ.csv

Cscriptで起動して、リダイレクトして使ってみてください。

※手抜きで オッズの表 を .Echoで出力しているので、ファイルにするためにリダイレクトしてください。


テスト結果と操作動画: http://www.youtube.com/watch?v=atKqUg03sRs


テスト結果・作業動画 : http://www.youtube.com/watch?v=D7IKAJedKE0

返信2012/04/14 15:02:22

2ken3memoken3memo   1  1.1 情報メニューを探す

ここから、情報メニューが表示されているIEを探して、処理を行うには?

似ている処理、入金処理からコードをコピーして使ってみます(ぉぃぉぃ)

'シェルのオブジェクトを作成する

Set objShell = CreateObject("Shell.Application")

ここから、

For Each objWindow In objShell.Windows

で回して、

TypeNameでHTMLDocumentか判断、

If TypeName(objWindow.document) = "HTMLDocument" Then

さらに、

URLで判断(見つけてみました。)

If objWindow.document.URL = "https://www.ipat.jra.go.jp/pw_020_i.cgi" Then

操作動画: http://www.youtube.com/watch?v=7prqu0Ty6gA

ソースコード

ソースコード

'複数立ち上がったIEから IPAT 投票メニューを見つける

    'オブジェクトを格納する変数
    Dim objShell, objWindow
    Dim objIE 

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If objWindow.document.URL = "https://www.ipat.jra.go.jp/pw_020_i.cgi" Then
               Set objIE = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE Is Nothing Then
        msgbox "エラー 投票メニューが見つかりません"
        wscript.quit
    End If   
返信2012/04/14 11:47:09

3ken3memoken3memo   1  1.2 情報メニューを押す

上で見つけた、IEから、情報メニューを押したかったので、

.getElementsByTagName("A")

で、

リンクのAタグを集めて、

.OuterHTMLで中身のソースを確認、

中に、情報メニューがあるか?(InStr関数で探し)

If InStr(objA(n).OuterHTML, "情報メニュー") > 0 Then

で判断してみました。

操作動画 : http://www.youtube.com/watch?v=w5KsIonPHZ0

コード

'↑上で見つけたIPAT 投票メニューから 情報メニュー を 押す

    'Aのタグを集める .getElementsByTagName("A")を使用
    Set objA = objIE.Document.getElementsByTagName("A")

    'ループで頭から表示してみる
    For n = 0 To objA.Length - 1
        '※.InnerHTMLじゃなくて、.OuterHTMLでAの全体を見る
        '情報メニューのリンクを探す、ソースの文字を探す
        If InStr(objA(n).OuterHTML, "情報メニュー") > 0 Then
            objA(n).Click  'クリックする
            Exit For  'ループを抜ける
        End If
    Next

    Set objA = Nothing  'オブジェクト変数解放
返信2012/04/14 11:49:17

4ken3memoken3memo   1  2.起動した情報メニュー(新しいIE)を操作する

IPAT情報メインメニュー

https://info.ipat.jra.go.jp/p/s

を探します。

また、馬鹿の一つ覚えで

CreateObject("Shell.Application")

から探ってみました。

おまけで、みつけたIEのFORMタグを表示してみました。

操作動画: http://www.youtube.com/watch?v=dwNQaLV3xD0

コード

'またまた、新しく起動した IPAT情報メインメニュー を 探す

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If objWindow.document.URL = "https://info.ipat.jra.go.jp/p/s" Then
               Set objIE = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE Is Nothing Then
        msgbox "エラー IPAT情報メインメニュー 見つかりません"
        wscript.quit
    End If   

'テストでフォームを表示 FORMを探す

    'FORMのタグを集める .getElementsByTagName("FORM")を使用
    Set objFORM = objIE.Document.getElementsByTagName("FORM")

    'ループで頭から表示してみる
    For n = 0 To objFORM.Length - 1
        '※.InnerHTMLじゃなくて、.OuterHTMLでAの全体を見る
        Wscript.ECHO objFORM(n).OuterHTML
    Next

    Set objFORM = Nothing  'オブジェクト変数解放
返信2012/04/14 11:51:15

5ken3memoken3memo   1  3.開催地を選択する SELECTタグの競馬場を選択し決定を押す

競馬場 開催地 選択のソースを見ると

<FORM method=post action=http://info.ipat.jra.go.jp/p/s>
<INPUT name=g value=Mnu01 type=hidden>
<INPUT name=s value=0000000 type=hidden>
<INPUT name=j value=6123500000 type=hidden>
<INPUT name=w value=3e2c27747c352f23 type=hidden>
<TD>
<SELECT size=4 name=m>
<OPTION selected value=61235>2012年 3回 中山 5日 (当日売)
<OPTION value=91225>2012年 2回 阪神 5日 (当日売)
<OPTION value=31211>2012年 1回 福島 1日 (当日売)
<OPTION value=91226>2012年 2回 阪神 6日 (前日売)
</OPTION></SELECT></TD>
<TD>&nbsp;</TD>
<TD class=top>
<TABLE border=0 cellSpacing=0 cellPadding=0>
<TBODY>
<TR>
<TD class=nwtop colSpan=2>情報を取得したい「年次・回次・競馬場・日次」を選択して
ください。
<TD></TD>
<TR>
<TD><INPUT value=決定 type=submit></TD></FORM>

※↑改行位置変更

となっているので、

name=m の SELECTタグのOPTIONを選択 selected 状態にして決定を押し、開催地を変更します。

3.1 SELECTタグを集める

name=m が 複数あるので、

まず、SELECT タグを集めてから、name=mを探してみます。

Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

で、集めると、

objSELECT.Length で 個数がわかるので、

ループで回し、.Nameが ="m" の SELECTタグを見つけます。

For n = 0 To objSELECT.Length - 1

'※.Nameで判断する

If objSELECT(n).Name = "m" Then

Set objM = objSELECT(n) '見つけたname=mを新しくオブジェクト変数に代入

3.2 OPTIONを選択 開催地の選択

'次に下のオプションを探る

オプションの数は objM.OPTIONs.Length

と、

これも似たような感じで、.OPTIONs.Lengthで知ることができます。

'今回は使わなかったけど、中身をループで表示

For n = 0 To objM.OPTIONs.Length - 1
    Wscript.ECHO n & "番目 .InnerTEXTは " & objM.OPTIONs(n).innerTEXT
Next 

で、確認するといいかも。

テストで 3番目(2)を選択してみました

objM.OPTIONs(2).selected = True '単純にselectedプロパティをTrueでセレクト状態にする

※0 1 2 3なので、(2)のセレクト状態 .selected を True にしただけです。

3.3 決定 を 押し、開催地を変更する

これも、同じように(もう、いいかげんなれましたか?)

INPUTのタグを集める .getElementsByTagName("INPUT")を使用

Set objINPUT = objIE.Document.getElementsByTagName("INPUT")

で、集めて、

objINPUT.Length の 数だけ回して、.Value 値を確認して、.Clickしてみました。

決定ボタンを.Valueで探してから、.Clickしてみました。

    'ループで頭から表示してみる
    For n = 0 To objINPUT.Length - 1
        '※.valueで値を見る
        If objINPUT(n).Value = "決定" Then
            objINPUT(n).Click  '決定のボタンを押す
            exit For  'ループを抜ける
	end If
    Next

操作結果と解説動画

いつもの 操作動画と解説動画です。

テスト動画 : http://www.youtube.com/watch?v=gzkfBEEsRn0

テストのソースコード

競馬場・開催地の選択、テストのソースコードです。

'またまた、新しく起動した IPAT情報メインメニュー を 探す

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If objWindow.document.URL = "https://info.ipat.jra.go.jp/p/s" Then
               Set objIE = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE Is Nothing Then
        msgbox "エラー IPAT情報メインメニュー 見つかりません"
        wscript.quit
    End If   

'SELECT name=m の 開催地オプションを選択する

    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

    Wscript.ECHO "SELECTのタグは " & objSELECT.Length & "個です。"  

    'ループで頭から表示してみる
    Set objM = Nothing
    For n = 0 To objSELECT.Length - 1
        '※.Nameで判断する
        If objSELECT(n).Name = "m" Then
            Set objM = objSELECT(n)  '見つけたname=mを新しくオブジェクト変数に代入
            exit For  'ループを抜ける
	End If
        'Wscript.ECHO n & "番目 .Name=" & objSELECT(n).Name  '名前の確認
        'Wscript.ECHO objSELECT(n).OuterHTML
    Next

    Set objSELECT = Nothing  'オブジェクト変数解放

    '見つけたかチェック
    If objM Is Nothing Then
        msgbox "エラー 開催地 Name=m が 見つかりません"
        wscript.quit
    End If   

'次に下のオプションを探る

    Wscript.ECHO "オプションの数は" & objM.OPTIONs.Length
    '中身をループで表示
    For n = 0 To objM.OPTIONs.Length - 1
        Wscript.ECHO n & "番目 .InnerTEXTは " & objM.OPTIONs(n).innerTEXT
    Next 

    'テストで 3番目(2)を選択する ※0 1 2 3 
    objM.OPTIONs(2).selected = True   '単純にselectedプロパティをTrueでセレクト状態にする

'決定を押し、開催地を切り替える

    'INPUTのタグを集める .getElementsByTagName("INPUT")を使用
    Set objINPUT = objIE.Document.getElementsByTagName("INPUT")

    Wscript.ECHO "INPUTのタグは " & objINPUT.Length & "個です。"  

    'ループで頭から表示してみる
    For n = 0 To objINPUT.Length - 1
        '※.valueで値を見る
        If objINPUT(n).Value = "決定" Then
            objINPUT(n).Click  '決定のボタンを押す
            exit For  'ループを抜ける
	end If
    Next
返信2012/04/14 11:52:48

6ken3memoken3memo   1  4.オッズのボタンを押す

本当は、レース番号のオッズボタンを押すのが正しいと思いますが、

ここでは、一番初めに見つけた オッズ の ボタンを押してみます。

※1Rに決め打ちして、オッズの画面に切り替える

処理としては、同じように

.getElementsByTagName("INPUT")で集めて、

Set objINPUT = objIE.Document.getElementsByTagName("INPUT")

ループを作り、

If objINPUT(n).Value = "オッズ" Then

※.valueで値を見て判断、.Clickしただけです。。。

操作・テスト動画 : http://www.youtube.com/watch?v=TlR-6dTYiuY

'オッズのボタンを押す ※一番最初に見つかったボタンを押す(ここではレース無視)

    'INPUTのタグを集める .getElementsByTagName("INPUT")を使用
    Set objINPUT = objIE.Document.getElementsByTagName("INPUT")

    'Wscript.ECHO "INPUTのタグは " & objINPUT.Length & "個です。"  

    'ループで頭から表示してみる
    For n = 0 To objINPUT.Length - 1
        '※.valueで値を見る
        If objINPUT(n).Value = "オッズ" Then
            objINPUT(n).Click  'オッズのボタンを押す
            exit For  'ループを抜ける
	end If
    Next

'表示を待つ※オッズの切り替えを待つ
    'ページの表示完了を待ちます。
    While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
        WScript.Sleep  100  '0.1秒待つ 1000で1秒
    Wend
返信2012/04/14 11:54:14

7ken3memoken3memo   1  5.レースの選択と種類(単勝や馬連、、)を選択する

画面がオッズの画面に切り替わったら、

テストで、

レース番号を選択(テストで11Rを選択)

オッズの種類(一番上の 単・複 を選択)

してまみす。

<SELECT name="s">
<OPTION value="3121210" selected>1R</OPTION>
<OPTION value="3121220">2R</OPTION>
・
・
<OPTION value="31212a0">10R</OPTION>
<OPTION value="31212b0">11R</OPTION>
<OPTION value="31212c0">12R</OPTION>
</SELECT>

<SELECT name="g">
<OPTION value="Ota01">単・複・枠連オッズ</OPTION>
<OPTION value="Oum01" selected>馬連オッズ</OPTION>
<OPTION value="Out01">馬単オッズ</OPTION>
<OPTION value="Owi01">ワイドオッズ</OPTION>
<OPTION value="Osa00">3連複オッズ</OPTION>
<OPTION value="Ost00">3連単オッズ</OPTION>
<OPTION value="Oum02">馬連オッズ(人気順)</OPTION>
<OPTION value="Out02">馬単オッズ(人気順)</OPTION>
<OPTION value="Osa02">3連複オッズ(人気順)</OPTION>
<OPTION value="Ost02">3連単オッズ(人気順)</OPTION>
<OPTION value="Den01">出馬表</OPTION>
</SELECT>

↑上からn番目 で SELECTタグを選択するなら、

.SelectedIndex = 99

でOKです。

もうひとつ、値 valueがわかっているなら、

直接 SELECTタグの値 .Valueに代入するのもアリかなぁ。

無駄に長い解説 : http://www.youtube.com/watch?v=ElG3fOsmCuM

↑よりも、ソース↓をみたほうが速いか・・

'レース番号 と オッズの種類を選択する
'11Rと単・複 を テストで選択する

    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

    Wscript.ECHO "SELECTのタグは " & objSELECT.Length & "個です。"  

    '11Rを選択 選択された場所を上から10番目(11個目にする)
    objSELECT.Item("s").SelectedIndex = 11 - 1  '上から 0 1 2 3... と場所を指定する

    '値がわかっているなら、値を入れる こともできます。
    objSELECT.Item("g").Value = "Ota01"  'Ota01 単・複・枠連オッズを代入

    Set objSELECT = Nothing  'オブジェクト変数解放

↑こんな感じで書くこともできるので、使ってみてください。

6.決定ボタンを押す

これは、前回と同じでいいのかなぁ?

'決定を押し、レースとオッズを切り替える

    'INPUTのタグを集める .getElementsByTagName("INPUT")を使用
    Set objINPUT = objIE.Document.getElementsByTagName("INPUT")

    Wscript.ECHO "INPUTのタグは " & objINPUT.Length & "個です。"  

    'ループで頭から表示してみる
    For n = 0 To objINPUT.Length - 1
        '※.valueで値を見る
        If objINPUT(n).Value = "決定" Then
            objINPUT(n).Click  '決定のボタンを押す
            exit For  'ループを抜ける
	end If
    Next

これで、やっと、表の表示まで来たので、

あとは、

7.表示されたオッズの表を取得する

かぁ・・・まだまだ、先は長いかなぁ。。。

返信2012/04/14 11:55:46

8ken3memoken3memo   1  7.1 テーブルのソースを探る

テーブルのソースを確認したかったので、

表示済みのIEを探し、

.getElementsByTagName("TABLE")を使用して、テーブルを集めて、

Set objTABLE = objIE.Document.getElementsByTagName("TABLE")

.Lengthで個数のチェック、

中身(.OuterHTML)をWscript.ECHOで出力してみました。

操作・確認手順の動画 : http://www.youtube.com/watch?v=gp64Z5XLte4

'起動済みの IPAT情報メインメニュー を 探す

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           'URLをチェックする(アドレスを探す)
           If InStr(objWindow.document.URL, "info.ipat.jra.go.jp/p/s") > 0 Then
               Set objIE = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE Is Nothing Then
        msgbox "エラー IPAT情報 オッズ画面が 見つかりません"
        wscript.quit
    End If   

'テーブルを抜き出す

    'TABLEのタグを集める .getElementsByTagName("TABLE")を使用
    Set objTABLE = objIE.Document.getElementsByTagName("TABLE")

    Wscript.ECHO "TABLEのタグは " & objTABLE.Length & "個です。"  

    'ループで頭から 中身を表示してみる
    For n = 0 To objTABLE.Length - 1
        Wscript.ECHO n & "番目 .id=" & objTABLE(n).id  '名前の確認
        Wscript.ECHO objTABLE(n).OuterHTML
    Next

    Set objTABLE = Nothing  'オブジェクト変数解放

4番目 .id=

<TABLE border=0 cellPadding=2><TBODY>
<TR>
<TD class=top>

<TABLE border=0 cellSpacing=2 cellPadding=2>
<TBODY>
<TR>
<TH class=title6>枠番</TH>
<TH class=title6>馬番</TH>
<TH class=title6>馬名</TH>
<TH class=title6>単勝</TH>
<TH class=title6 colSpan=3>複勝</TH></TR>

<TR class=bgccffcc>

<TH>
<TABLE border=0 cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
返信2012/04/14 11:59:14

9ken3memoken3memo   1  7.2 テーブルの左上のデータで確認する 左上が枠番のテーブルを探す

テーブルの左上が枠番となっているテーブルを探したかったので、

Wscript.ECHO objTABLE(n).Rows(0).Cells(0).InnerTEXT

みたいな感じて、

.Rows(0)で1行目、

.Cells(0)で1列目

.InnerTEXTで中の文字を取得できるので、

If objTABLE(n).Rows(0).Cells(0).InnerTEXT = "枠番" Then

で判断してみました。

おまけで、

Wscript.ECHO objTABLE(n).Rows(2).Cells(1).InnerTEXT

Wscript.ECHO objTABLE(n).Rows(2).Cells(2).InnerTEXT

Wscript.ECHO objTABLE(n).Rows(2).Cells(3).InnerTEXT

を表示して、テストしてみました。

テスト結果 操作動画: http://www.youtube.com/watch?v=Ii42c0UBgdE


'起動済みの IPAT情報メインメニュー を 探す

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           'URLをチェックする(アドレスを探す)
           If InStr(objWindow.document.URL, "info.ipat.jra.go.jp/p/s") > 0 Then
               Set objIE = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE Is Nothing Then
        msgbox "エラー IPAT情報 オッズ画面が 見つかりません"
        wscript.quit
    End If   

'テーブルを抜き出す

    'TABLEのタグを集める .getElementsByTagName("TABLE")を使用
    Set objTABLE = objIE.Document.getElementsByTagName("TABLE")

    Wscript.ECHO "TABLEのタグは " & objTABLE.Length & "個です。"  

    'ループで頭から 中身を表示してみる
    For n = 0 To objTABLE.Length - 1
        Wscript.ECHO n & "番目 .id=" & objTABLE(n).id  '名前の確認
        Wscript.ECHO objTABLE(n).Rows(0).Cells(0).InnerTEXT
        If objTABLE(n).Rows(0).Cells(0).InnerTEXT = "枠番" Then
            Exit For  'ループを抜ける
        End If
    Next

    '↑みつけたテーブルからデータを抜きます
    Wscript.ECHO objTABLE(n).Rows(0).Cells(0).InnerTEXT
    Wscript.ECHO objTABLE(n).Rows(1).Cells(2).InnerTEXT
    Wscript.ECHO objTABLE(n).Rows(2).Cells(1).InnerTEXT
    Wscript.ECHO objTABLE(n).Rows(2).Cells(2).InnerTEXT
    Wscript.ECHO objTABLE(n).Rows(2).Cells(3).InnerTEXT
    Wscript.ECHO objTABLE(n).Rows(2).Cells(4).InnerTEXT

    Set objTABLE = Nothing  'オブジェクト変数解放
返信2012/04/14 12:00:23

10ken3memoken3memo   1  7.3 単勝のオッズをカンマ区切りで出力してみた

目的のテーブルを

If objTABLE(n).Rows(0).Cells(0).InnerTEXT = "枠番" Then

で探すことができたので、

中のデータ(テキスト)を取り出し、カンマ区切りで出力してみます。

ポイントは、

.Rows.Length で 行数、

.Rows(y).Cells.Length で 列数

が取得できるので、単純にループで回してみました。

ソースを見た方が はやいですね キット。

実行結果 と ソースを見て、アレンジしてください。

実行結果 操作動画: http://www.youtube.com/watch?v=CfMnQEF09hk

ソース

'起動済みの IPAT情報メインメニュー を 探す

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objIE = Nothing    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           'URLをチェックする(アドレスを探す)
           If InStr(objWindow.document.URL, "info.ipat.jra.go.jp/p/s") > 0 Then
               Set objIE = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    '見つけたかチェック
    If objIE Is Nothing Then
        msgbox "エラー IPAT情報 オッズ画面が 見つかりません"
        wscript.quit
    End If   

'テーブルを抜き出す

    'TABLEのタグを集める .getElementsByTagName("TABLE")を使用
    Set objTABLE = objIE.Document.getElementsByTagName("TABLE")

    'Wscript.ECHO "TABLEのタグは " & objTABLE.Length & "個です。"  

    'ループで頭から 中身を表示してみる
    For n = 0 To objTABLE.Length - 1
        'Wscript.ECHO n & "番目 .id=" & objTABLE(n).id  '名前の確認
        'Wscript.ECHO objTABLE(n).Rows(0).Cells(0).InnerTEXT
        If objTABLE(n).Rows(0).Cells(0).InnerTEXT = "枠番" Then
            Exit For  'ループを抜ける
        End If
    Next

    '↑みつけたテーブルからデータを抜きます
    '↓.Lengthで行と列を取り出し、2重ループさせる
    For y = 0 To objTABLE(n).Rows.Length - 1  '行のループ
        strLINE = ""  '空の文字列で初期化
        For x = 0 To objTABLE(n).Rows(y).Cells.Length - 1  '列のループ
            '.InnerTextで中身の文字列を取り出し &でつなげ ,カンマを付ける
            strLINE = strLINE & objTABLE(n).Rows(y).Cells(x).InnerText & ","
        Next
        '作成した文字列(1行分↑)を出力する
        Wscript.ECHO strLINE    '一番後ろのゴミカンマは気にしない(ぉぃぉぃ)
    Next

実行

Cscript TEST.VBS > 結果.txt

などで、実行させてテストしてみてください。

返信2012/04/14 12:02:00

11ken3memoken3memo   1  8.1 1Rから最後まで 次のレースを選択 繰り返す

変数を2つ作成して、

レース番号 と オッズの種類を覚えます。

Dim nR 'レース数

Dim strR_NAME(13) 'レース 通常連番だからいらないんだけど・・・

'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

nR = objSELECT.Item("s").OPTIONs.Length  'レース数を代入
For n = 0 To objSELECT.Item("s").OPTIONs.Length - 1
    strR_NAME(n) = objSELECT.Item("s").OPTIONs(n).innerTEXT  '名前を代入
Next 

レースの数を取得したら、あとは、ループ処理で、

'ループ、頭から終わりのレースまでループさせる

For r = 0 To nR - 1 '上↑で保存したレース数分まわる

でまわし、

レースの選択、決定を繰り返しながら1R-12Rまでのオッズを出力します。

テスト結果と操作動画: http://www.youtube.com/watch?v=atKqUg03sRs

'複数立ち上がったIEから IPAT 投票メニューを見つける

    Set objIE = getIE_URL("//www.ipat.jra.go.jp/pw_020_i.cgi")

    '見つけたかチェック
    If objIE Is Nothing Then
        wscript.Echo "エラー 投票メニューが見つかりません ログインを確認してください"
        wscript.quit
    End If   

'↑上で見つけたIPAT 投票メニューから 情報メニュー を 押す

    Call IE_A_Click(objIE, "情報メニュー")   'Aタグの 情報メニューを押す
    Set objIE = Nothing  'メニューはもう使わないので  
    WScript.Sleep  5000  '5秒待つ 1000で1秒

'次は、新しく起動した IPAT情報メインメニュー を 探す

    Set objIE = getIE_URL("//info.ipat.jra.go.jp/p/s")

    '見つけたかチェック
    If objIE Is Nothing Then
        wscript.Echo "エラー IPAT情報メインメニュー 見つかりません"
        wscript.quit
    End If   


'SELECT name=m の 開催地オプションを選択する

    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

    'ループで頭から表示してみる
    Set objM = Nothing
    For n = 0 To objSELECT.Length - 1
        '※.Nameで判断する
        If objSELECT(n).Name = "m" Then
            Set objM = objSELECT(n)  '見つけたname=mを新しくオブジェクト変数に代入
            exit For  'ループを抜ける
	End If
    Next

    Set objSELECT = Nothing  'オブジェクト変数解放

    '見つけたかチェック
    If objM Is Nothing Then
        msgbox "エラー 開催地 Name=m が 見つかりません"
        wscript.quit
    End If   

'次に下のオプションを探る 競馬場・開催地を保存する

    Dim nJYO             '開催数
    Dim strJYO_NAME(10)  '開催地名前 10もいらないけど

    nJYO = objM.OPTIONs.Length  '数を代入
 
    '中身をループで表示
    For n = 0 To objM.OPTIONs.Length - 1
        strJYO_NAME(n) = objM.OPTIONs(n).innerTEXT  '名前を代入
    Next 

    'テストで 0 頭を選択する ※0 1 2 3 
    objM.OPTIONs(0).selected = True   '単純にselectedプロパティをTrueでセレクト状態にする
    Call IE_INPUT_Click_VALUE(objIE, "決定")    '決定を押し、開催地を切り替える

'表示を待つ※競馬場・開催地の切り替えを待つ
    Call IE_WAIT

'オッズのボタンを押す ※一番最初に見つかったボタンを押す(ここではレース無視)
    Call IE_INPUT_Click_VALUE(objIE, "オッズ")    'オッズを押し、表示を切り替える

'表示を待つ※オッズの切り替えを待つ
    Call IE_WAIT

'5.レース番号 と オッズの種類を覚える

    Dim nR             'レース数
    Dim strR_NAME(13)  'レース 通常連番だからいらないんだけど・・・ 

    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

    nR = objSELECT.Item("s").OPTIONs.Length  'レース数を代入
 
    '中身をループで表示 レース
    For n = 0 To objSELECT.Item("s").OPTIONs.Length - 1
        strR_NAME(n) = objSELECT.Item("s").OPTIONs(n).innerTEXT  '名前を代入
    Next 

    Set objSELECT = Nothing   '一度クリアじゃないけど、キレイにする

'ループ、頭から終わりのレースまでループさせる
  For r = 0 To nR - 1  '上↑で保存したレース数分まわる

    '改めて、レースの選択 SELECTを取得する
    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")   

    'レース番号を選択
    objSELECT.Item("s").SelectedIndex = r  '上から r 番目のレースを選択
    WScript.Sleep  500  '0.5秒待ってから

    '単勝オッズを選択
    objSELECT.Item("g").Value = "Ota01"  'Ota01 固定をセット(単・複・枠連オッズ)を代入
    WScript.Sleep  500  '0.5秒待ってから

    Set objSELECT = Nothing  'オブジェクト変数解放

'6.決定を押し、レースとオッズを切り替える
    Call IE_INPUT_Click_VALUE(objIE, "決定")    '決定を押し、レースとオッズを切り替える

'表示を待つ※オッズの切り替えを待つ
    Call IE_WAIT

'7.オッズの表を取得(出力する)
    'テーブルを抜き出す

    'TABLEのタグを集める .getElementsByTagName("TABLE")を使用
    Set objTABLE = objIE.Document.getElementsByTagName("TABLE")

    'ループで頭から 中身を表示してみる
    For n = 0 To objTABLE.Length - 1
        If objTABLE(n).Rows(0).Cells(0).InnerTEXT = "枠番" Then
            Exit For  'ループを抜ける
        End If
    Next

    '↑みつけたテーブルからデータを抜きます
    '↓.Lengthで行と列を取り出し、2重ループさせる
    For y = 0 To objTABLE(n).Rows.Length - 1  '行のループ
        strLINE = ""  '空の文字列で初期化
        For x = 0 To objTABLE(n).Rows(y).Cells.Length - 1  '列のループ
            '.InnerTextで中身の文字列を取り出し &でつなげ ,カンマを付ける
            strLINE = strLINE & objTABLE(n).Rows(y).Cells(x).InnerText & ","
        Next  'テーブルの列 x の ループ
        '作成した文字列(1行分↑)を出力する
        strLINE = strR_NAME(r) & "," & strLINE  '頭にレース番号を追加する 
        Wscript.ECHO strLINE    '一番後ろのゴミカンマは気にしない(ぉぃぉぃ)
    Next  'テーブルの行 y の ループ

  Next  'レース r のループ


'サブルーチンなど

'URLを受け取り、IEを探し、リターン値として返す
Function getIE_URL(sURL)

    'オブジェクトを格納する変数
    Dim objShell, objWindow
    Dim objRET  'リターン

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objRET = Nothing   'リターン値を初期化する    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If InStr(objWindow.document.URL, sURL) > 0 Then   'URLが含まれているか?
               Set objRET = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    Set getIE_URL = objRET     'リターン値をセット(値を返す)

End Function

'Aタグ
'oIE と クリックする文字列を受け取り、見つけたら.Click する
'(※InStrの手抜き処理なので、京都と東京都に注意 完全一致は InnerTEXTで=にする)
Sub IE_A_Click(oIE, sHTML)
    'Aのタグを集める .getElementsByTagName("A")を使用
    Set objA = oIE.Document.getElementsByTagName("A")

    'ループで頭から表示してみる
    For n = 0 To objA.Length - 1
        '※.InnerHTMLじゃなくて、.OuterHTMLでAの全体を見る
        'リンクを探す、ソースの文字を探す
        If InStr(objA(n).OuterHTML, sHTML) > 0 Then  '文字を見つけたら
            objA(n).Click  'クリックする
            Exit For  'ループを抜ける
        End If
    Next

    Set objA = Nothing  'オブジェクト変数解放
End Sub

'INPUTのタグ、.Valueで比べる
'oIE と クリックする値を受け取り、見つけたら.Click する
Sub IE_INPUT_Click_VALUE(oIE, sVALUE)
    'INPUTのタグを集める .getElementsByTagName("INPUT")を使用
    Set objINPUT = oIE.Document.getElementsByTagName("INPUT")

    'ループで頭から表示してみる
    For n = 0 To objINPUT.Length - 1
        '※.valueで値を見る
        If objINPUT(n).Value = sVALUE Then
            objINPUT(n).Click  'みつけたボタンを押す
            exit For  'ループを抜ける
	end If
    Next

    Set objINPUT = Nothing

End Sub

'IEの表示完了を待つ
Sub IE_WAIT()

    WScript.Sleep  500  '0.5秒待ってから
    
    'ページの表示完了を待ちます。
    While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
        WScript.Sleep  100  '0.1秒待つ 1000で1秒
    Wend

    WScript.Sleep  1500  '関数を抜ける前におまけで1.5秒待つ(ぉぃぉぃ)

End Sub
返信2012/04/14 12:03:29

12ken3memoken3memo   1  8.2 開催地・競馬場単位でループさせる

次は、開催地、競馬場単位でループさせてみます。

場名を覚えた後にループさせてみます。

'競馬場・開催地でループする。 jのループ

For j = 0 To nJYO - 1 '↑上で保存したnJYOの分だけ回る

でループを作り、

'name=m の オプションのj番目を選択する

objSELECT.Item("m").OPTIONs(j).selected = True '単純にj番目をselected Trueでセレクト状態にする

で選択後、決定を押し、

Call IE_INPUT_Click_VALUE(objIE, "決定") '決定を押し、開催地を切り替える

'表示を待つ※競馬場・開催地の切り替えを待つ

Call IE_WAIT

1R-12Rのレース 終了後、

メインメニューへ戻るのを忘れずに。

テスト結果・作業動画 : http://www.youtube.com/watch?v=D7IKAJedKE0

作成したソースファイル

'複数立ち上がったIEから IPAT 投票メニューを見つける

    Set objIE = getIE_URL("//www.ipat.jra.go.jp/pw_020_i.cgi")

    '見つけたかチェック
    If objIE Is Nothing Then
        wscript.Echo "エラー 投票メニューが見つかりません ログインを確認してください"
        wscript.quit
    End If   

'↑上で見つけたIPAT 投票メニューから 情報メニュー を 押す

    Call IE_A_Click(objIE, "情報メニュー")   'Aタグの 情報メニューを押す
    Set objIE = Nothing  'メニューはもう使わないので  
    WScript.Sleep  5000  '5秒待つ 1000で1秒

'次は、新しく起動した IPAT情報メインメニュー を 探す

    Set objIE = getIE_URL("//info.ipat.jra.go.jp/p/s")

    '見つけたかチェック
    If objIE Is Nothing Then
        wscript.Echo "エラー IPAT情報メインメニュー 見つかりません"
        wscript.quit
    End If   


'SELECT name=m の 開催地オプションを選択する

    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

    'ループで頭から表示してみる
    Set objM = Nothing
    For n = 0 To objSELECT.Length - 1
        '※.Nameで判断する
        If objSELECT(n).Name = "m" Then
            Set objM = objSELECT(n)  '見つけたname=mを新しくオブジェクト変数に代入
            exit For  'ループを抜ける
	End If
    Next

    Set objSELECT = Nothing  'オブジェクト変数解放

    '見つけたかチェック
    If objM Is Nothing Then
        msgbox "エラー 開催地 Name=m が 見つかりません"
        wscript.quit
    End If   

'次に下のオプションを探る 競馬場・開催地を保存する

    Dim nJYO             '開催数
    Dim strJYO_NAME(10)  '開催地名前 10もいらないけど

    Dim nR               'レース数
    Dim strR_NAME(13)    'レース 通常連番だからいらないんだけど・・・ 

    nJYO = objM.OPTIONs.Length  '数を代入
 
    '中身をループで表示
    For n = 0 To objM.OPTIONs.Length - 1
        strJYO_NAME(n) = objM.OPTIONs(n).innerTEXT  '名前を代入
    Next 

    Set objM = Nothing

'競馬場・開催地でループする。 jのループ
For j = 0 To nJYO - 1  '↑上で保存したnJYOの分だけ回る

    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

    'name=m の オプションのj番目を選択する 
    objSELECT.Item("m").OPTIONs(j).selected = True  '単純にj番目をselected Trueでセレクト状態にする

    '選択後、決定を押し、
    Call IE_INPUT_Click_VALUE(objIE, "決定")    '決定を押し、開催地を切り替える

    '表示を待つ※競馬場・開催地の切り替えを待つ
    Call IE_WAIT

'オッズのボタンを押す ※一番最初に見つかったボタンを押す(ここではレース無視)
    Call IE_INPUT_Click_VALUE(objIE, "オッズ")    'オッズを押し、表示を切り替える

'表示を待つ※オッズの切り替えを待つ
    Call IE_WAIT

'5.レース番号 と オッズの種類を覚える

    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

    nR = objSELECT.Item("s").OPTIONs.Length  'レース数を代入
 
    '中身をループで表示 レース
    For n = 0 To objSELECT.Item("s").OPTIONs.Length - 1
        strR_NAME(n) = objSELECT.Item("s").OPTIONs(n).innerTEXT  '名前を代入
    Next 

    Set objSELECT = Nothing   '一度クリアじゃないけど、キレイにする

'ループ、頭から終わりのレースまでループさせる
  For r = 0 To nR - 1  '上↑で保存したレース数分まわる

    '改めて、レースの選択 SELECTを取得する
    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")   

    'レース番号を選択
    objSELECT.Item("s").SelectedIndex = r  '上から r 番目のレースを選択
    WScript.Sleep  500  '0.5秒待ってから

    '単勝オッズを選択
    objSELECT.Item("g").Value = "Ota01"  'Ota01 固定をセット(単・複・枠連オッズ)を代入
    WScript.Sleep  500  '0.5秒待ってから

    Set objSELECT = Nothing  'オブジェクト変数解放

'6.決定を押し、レースとオッズを切り替える
    Call IE_INPUT_Click_VALUE(objIE, "決定")    '決定を押し、レースとオッズを切り替える

'表示を待つ※オッズの切り替えを待つ
    Call IE_WAIT

'7.オッズの表を取得(出力する)
    'テーブルを抜き出す

    'TABLEのタグを集める .getElementsByTagName("TABLE")を使用
    Set objTABLE = objIE.Document.getElementsByTagName("TABLE")

    'ループで頭から 中身を表示してみる
    For n = 0 To objTABLE.Length - 1
        If objTABLE(n).Rows(0).Cells(0).InnerTEXT = "枠番" Then
            Exit For  'ループを抜ける
        End If
    Next

    '↑みつけたテーブルからデータを抜きます
    '↓.Lengthで行と列を取り出し、2重ループさせる
    For y = 0 To objTABLE(n).Rows.Length - 1  '行のループ
        strLINE = ""  '空の文字列で初期化
        For x = 0 To objTABLE(n).Rows(y).Cells.Length - 1  '列のループ
            '.InnerTextで中身の文字列を取り出し &でつなげ ,カンマを付ける
            strLINE = strLINE & objTABLE(n).Rows(y).Cells(x).InnerText & ","
        Next  'テーブルの列 x の ループ
        '作成した文字列(1行分↑)を出力する
        strLINE = strR_NAME(r) & "," & strLINE  '頭にレース番号を追加する
        strLINE = strJYO_NAME(j) & "," & strLINE  '頭にレース番号を追加する 
        Wscript.ECHO strLINE    '一番後ろのゴミカンマは気にしない(ぉぃぉぃ)
    Next  'テーブルの行 y の ループ

  Next  'レース r のループ

  'メインメニューへ戻る(開催地を再選択したいので、メニューへ戻す)
  Call IE_INPUT_Click_VALUE(objIE, "メインメニュー")  'メニューを押し、表示を切り替える

  '表示を待つ※メニューの切り替えを待つ
  Call IE_WAIT

Next  '開催地・競馬場 j のループ 

'サブルーチンなど

'URLを受け取り、IEを探し、リターン値として返す
Function getIE_URL(sURL)

    'オブジェクトを格納する変数
    Dim objShell, objWindow
    Dim objRET  'リターン

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objRET = Nothing   'リターン値を初期化する    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If InStr(objWindow.document.URL, sURL) > 0 Then   'URLが含まれているか?
               Set objRET = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    Set getIE_URL = objRET     'リターン値をセット(値を返す)

End Function

'Aタグ
'oIE と クリックする文字列を受け取り、見つけたら.Click する
'(※InStrの手抜き処理なので、京都と東京都に注意 完全一致は InnerTEXTで=にする)
Sub IE_A_Click(oIE, sHTML)
    'Aのタグを集める .getElementsByTagName("A")を使用
    Set objA = oIE.Document.getElementsByTagName("A")

    'ループで頭から表示してみる
    For n = 0 To objA.Length - 1
        '※.InnerHTMLじゃなくて、.OuterHTMLでAの全体を見る
        'リンクを探す、ソースの文字を探す
        If InStr(objA(n).OuterHTML, sHTML) > 0 Then  '文字を見つけたら
            objA(n).Click  'クリックする
            Exit For  'ループを抜ける
        End If
    Next

    Set objA = Nothing  'オブジェクト変数解放
End Sub

'INPUTのタグ、.Valueで比べる
'oIE と クリックする値を受け取り、見つけたら.Click する
Sub IE_INPUT_Click_VALUE(oIE, sVALUE)
    'INPUTのタグを集める .getElementsByTagName("INPUT")を使用
    Set objINPUT = oIE.Document.getElementsByTagName("INPUT")

    'ループで頭から表示してみる
    For n = 0 To objINPUT.Length - 1
        '※.valueで値を見る
        If objINPUT(n).Value = sVALUE Then
            objINPUT(n).Click  'みつけたボタンを押す
            exit For  'ループを抜ける
	end If
    Next

    Set objINPUT = Nothing

End Sub

'IEの表示完了を待つ
Sub IE_WAIT()

    WScript.Sleep  500  '0.5秒待ってから
    
    'ページの表示完了を待ちます。
    While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
        WScript.Sleep  100  '0.1秒待つ 1000で1秒
    Wend

    WScript.Sleep  1500  '関数を抜ける前におまけで1.5秒待つ(ぉぃぉぃ)

End Sub

xxxx.vbs などに保存して、

Cscript xxxx.vbs > オッズ.csv

Cscriptで起動して、リダイレクトして使ってみてください。

※手抜きで オッズの表 を .Echoで出力しているので、ファイルにするためにリダイレクトしてください。

返信2012/04/14 12:05:06

13ken3memoken3memo   1  テスト結果

下記のような感じで、取得することができます。

ここから、うまく展開できるといいんだけど・・・

xxxx.csv

Microsoft (R) Windows Script Host Version 5.7

Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

2012年 3回 中山 7日 (当日売),1R,枠番,馬番,馬名,単勝,複勝,

2012年 3回 中山 7日 (当日売),1R,1,1,アファーブル,3.7,1.3,-,1.8,

2012年 3回 中山 7日 (当日売),1R,2,2,クリップザクロップ,43.8,7.0,-,12.3,

2012年 3回 中山 7日 (当日売),1R,3,3,ジーガースズラン,179.5,34.0,-,61.7,

2012年 3回 中山 7日 (当日売),1R,3,4,アドリアーネ,40.3,4.6,-,8.0,

2012年 3回 中山 7日 (当日売),1R,4,5,エルトウショウ,116.6,15.6,-,28.2,

2012年 3回 中山 7日 (当日売),1R,4,6,コトブキハレスガタ,15.6,3.4,-,5.7,

2012年 3回 中山 7日 (当日売),1R,5,7,ピュアサクセス,62.0,9.7,-,17.4,

2012年 3回 中山 7日 (当日売),1R,5,8,エビータ,78.9,11.8,-,21.3,

2012年 3回 中山 7日 (当日売),1R,6,9,スターライラック,3.0,1.1,-,1.4,

2012年 3回 中山 7日 (当日売),1R,6,10,パッシフローラ,6.5,1.8,-,2.8,

2012年 3回 中山 7日 (当日売),1R,7,11,スギノアンフィニー,31.6,6.0,-,10.5,

2012年 3回 中山 7日 (当日売),1R,7,12,ファーマジェンヌ,4.5,1.5,-,2.3,

2012年 3回 中山 7日 (当日売),1R,8,13,クラウンミストラル,84.6,13.5,-,24.4,

2012年 3回 中山 7日 (当日売),1R,8,14,ニンファエア,13.0,3.1,-,5.2,

2012年 3回 中山 7日 (当日売),2R,枠番,馬番,馬名,単勝,複勝,

2012年 3回 中山 7日 (当日売),2R,1,1,ナムーン,94.3,13.1,-,34.6,

2012年 3回 中山 7日 (当日売),2R,1,2,ラブソングフォナナ,84.7,9.7,-,25.6,

2012年 3回 中山 7日 (当日売),2R,2,3,ヴァップ,20.2,3.6,-,8.9,

2012年 3回 中山 7日 (当日売),2R,2,4,ロマンチカ,22.4,2.1,-,4.8,

2012年 3回 中山 7日 (当日売),2R,3,5,アキノセイレン,46.7,6.8,-,17.5,

2012年 3回 中山 7日 (当日売),2R,3,6,ハルピュイア,14.4,2.4,-,5.7,

2012年 3回 中山 7日 (当日売),2R,4,7,ベルモントフェスタ,1.7,1.1,-,1.1,

2012年 3回 中山 7日 (当日売),2R,4,8,カシノアゲート,92.9,10.8,-,28.6,

2012年 3回 中山 7日 (当日売),2R,5,9,クリノハルダンジ,112.8,28.4,-,76.2,

2012年 3回 中山 7日 (当日売),2R,5,10,ブラックモア,24.5,3.8,-,9.4,

2012年 3回 中山 7日 (当日売),2R,6,11,セレブレートサマー,120.1,13.9,-,37.0,

2012年 3回 中山 7日 (当日売),2R,6,12,ダイワフランク,29.9,4.8,-,12.1,

2012年 3回 中山 7日 (当日売),2R,7,13,バトルブラーヴォウ,18.7,3.2,-,7.8,

2012年 3回 中山 7日 (当日売),2R,7,14,タイタンフォンテン,50.1,7.3,-,19.0,

2012年 3回 中山 7日 (当日売),2R,8,15,リバティーアゲイン,3.8,1.1,-,1.7,

2012年 3回 中山 7日 (当日売),2R,8,16,キャラメリゼ,43.8,4.6,-,11.7,

2012年 3回 中山 7日 (当日売),11R,枠番,馬番,馬名,単勝,複勝,

2012年 3回 中山 7日 (当日売),11R,1,1,メルシーモンサン,30.6,5.1,-,13.7,

2012年 3回 中山 7日 (当日売),11R,2,2,テイエムブユウデン,46.7,7.5,-,20.5,

2012年 3回 中山 7日 (当日売),11R,3,3,クランエンブレム,12.8,2.7,-,6.7,

2012年 3回 中山 7日 (当日売),11R,4,4,アグネスラナップ,10.1,2.5,-,6.2,

2012年 3回 中山 7日 (当日売),11R,4,5,キングジョイ,24.1,4.2,-,11.0,

2012年 3回 中山 7日 (当日売),11R,5,6,コスモソユーズ,26.0,2.9,-,7.3,

2012年 3回 中山 7日 (当日売),11R,5,7,バアゼルリバー,5.9,1.5,-,2.9,

2012年 3回 中山 7日 (当日売),11R,6,8,トーセンオーパス,19.2,3.5,-,9.1,

2012年 3回 中山 7日 (当日売),11R,6,9,マジェスティバイオ,1.7,1.1,-,1.1,

2012年 3回 中山 7日 (当日売),11R,7,10,セイエイ,45.5,5.9,-,16.0,

2012年 3回 中山 7日 (当日売),11R,7,11,ディアマイホース,37.2,6.3,-,17.1,

2012年 3回 中山 7日 (当日売),11R,8,12,バシケーン,16.4,2.6,-,6.6,

2012年 3回 中山 7日 (当日売),11R,8,13,モルフェサイレンス,80.2,10.8,-,29.9,

2012年 3回 中山 7日 (当日売),12R,枠番,馬番,馬名,単勝,複勝,

2012年 3回 中山 7日 (当日売),12R,1,1,ナイトオブザオペラ,6.4,2.9,-,4.5,

2012年 3回 中山 7日 (当日売),12R,2,2,コスモパイレット,25.0,4.1,-,6.6,

2012年 3回 中山 7日 (当日売),12R,3,3,ラヴリードリーム,19.0,3.3,-,5.2,

2012年 3回 中山 7日 (当日売),12R,4,4,ジーガーウイング,60.5,27.0,-,44.5,

2012年 3回 中山 7日 (当日売),12R,4,5,タンジブルアセット,3.2,1.2,-,1.4,

2012年 3回 中山 7日 (当日売),12R,5,6,ウエストハーバー,9.8,4.0,-,6.4,

2012年 3回 中山 7日 (当日売),12R,5,7,ナムラドリーミー,9.7,2.3,-,3.6,

2012年 3回 中山 7日 (当日売),12R,6,8,アグネスティンクル,16.0,3.8,-,6.1,

2012年 3回 中山 7日 (当日売),12R,6,9,ケイアイヘルメス,5.6,1.6,-,2.3,

2012年 3回 中山 7日 (当日売),12R,7,10,ガリレオシチー,34.2,4.5,-,7.4,

2012年 3回 中山 7日 (当日売),12R,7,11,フィールドチャペル,75.8,7.0,-,11.5,

2012年 3回 中山 7日 (当日売),12R,8,12,ディアマンボウ,18.5,4.1,-,6.6,

2012年 3回 中山 7日 (当日売),12R,8,13,ダイワモービル,7.1,2.1,-,3.2,

2012年 2回 阪神 7日 (当日売),1R,枠番,馬番,馬名,単勝,複勝,

2012年 2回 阪神 7日 (当日売),1R,1,1,メモリーシャルマン,28.9,7.7,-,21.3,

2012年 2回 阪神 7日 (当日売),1R,1,2,ピエナガイア,94.7,26.5,-,75.4,

2012年 2回 阪神 7日 (当日売),1R,2,3,トーブプリンセス,44.0,5.6,-,15.1,

2012年 2回 阪神 7日 (当日売),1R,2,4,アリスマイン,18.5,3.4,-,8.8,

2012年 2回 阪神 7日 (当日売),1R,3,5,タマモカフェゼリー,33.0,5.7,-,15.5,

2012年 2回 阪神 7日 (当日売),1R,3,6,フミノアマゾン,132.8,24.6,-,70.1,

2012年 2回 阪神 7日 (当日売),1R,4,7,サンビスタ,7.5,1.7,-,3.8,

2012年 2回 阪神 7日 (当日売),1R,4,8,ウインアルエット,7.8,1.5,-,3.2,

2012年 2回 阪神 7日 (当日売),1R,5,9,スリーアメニティー,169.3,28.0,-,79.9,

2012年 2回 阪神 7日 (当日売),1R,5,10,パトリオット,14.0,3.0,-,7.8,

2012年 2回 阪神 7日 (当日売),1R,6,11,パッションロード,48.8,6.6,-,18.2,

2012年 2回 阪神 7日 (当日売),1R,6,12,シゲルリンゴ,21.0,3.0,-,7.6,

2012年 2回 阪神 7日 (当日売),1R,7,13,マイアイステラ,71.9,9.6,-,26.7,

2012年 2回 阪神 7日 (当日売),1R,7,14,ブライトポジー,23.6,3.5,-,9.2,

2012年 2回 阪神 7日 (当日売),1R,8,15,フーラブライド,1.6,1.1,-,1.1,

2012年 2回 阪神 7日 (当日売),1R,8,16,レディハードモア,245.2,48.9,-,140.2,

返信2012/04/27 08:14:55









    三流君 www.ken3.org(手打ちのHTMLで情報発信、最近は更新してなかったり...) 分類:HPを大きく分けると4つの柱(分類)です。
    ・人気は[VBA,マクロ]の解説、VBAからIE操作が人気です
    ・一昔前の[ASP(Active Server Pages)]の解説。
    ・読み物として[プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    ・おまけで[元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の異業種へ転職、コンビニ店長で失敗。

    動画・YouTube(動画で解説に手を出してみたが、評判はイマイチ...内容に問題アリ?)
    ・YouTube [ken3video] え~と、こんな感じ...の独り言が多い解説やテストの動画です。

    流行のBlogで情報発信(手打ちのHTMLよりブログで更新が楽なので)
    ・はてなを使用して[id:ken3memo]メモ的に放り込んでいるブログです
    ・[その他商品紹介Blog] ・・・ 内容の薄い、商品のメモ?です



    トップ ユーザー登録 ログイン ヘルプ