pythonJRAのHPからレース結果urlを得て各レースの1着騎手名と人気と配当を得る


        from bs4 import BeautifulSoup
        import requests
        import re
        #################################################################################   
        # urlを渡して指定文字を含むurlを得る関数  
        def url2urls(url,search_word):
            soup = url2soup(url)
            match = [a for a in soup.find_all('a') if search_word in str(a)]
            urls = [re.findall(r'/JRADB.+/[0-9a-fA-F]{2}', str(a))[0]for a in match]
            '重複削除順番維持'
            urls = sorted(set(urls), key=urls.index)
            if 'CNAME' in urls[0]:
                urls = ['https://www.jra.go.jp' + u for u in urls]
                return urls
            else:
                urls = [u.replace("'",'').split(',') for u in urls]
                #'/JRADB/accessK.html', 'pw04kmk001019/85',の後にスペースがあることがあるのでstrip
                urls = [('https://www.jra.go.jp' + u[0] ,'cname=' + u[1].strip()) 
                        for u in urls]
                return urls
        #################################################################################
        # urlを渡しsoupを得る 
        def url2soup(url):
            if len(url) == 2:
                return BeautifulSoup(requests.post(url[0], url[1]).content, 'html.parser') 
            if len(url) != 2:
                return BeautifulSoup(requests.get(url).content, 'html.parser')
        #################################################################################
        # urlを渡し馬場と日付を得る 
        def srl2bb8yymmdd(srl):
            dic = {
            '01': '札幌', '02': '函館', '03': '福島', '04': '新潟', '05': '東京', 
            '06': '中山', '07': '中京', '08': '京都', '09': '阪神', '10': '小倉'
            }
            return dic[srl[1][15:17]] , srl[1][-11:-3]
        ################################################################################
        # JRAのHPからレース結果urlを得て各レースの1着騎手名と人気と配当を得る         
        u = 'https://www.jra.go.jp/'
        u = url2urls(u,'レース結果')
        u = url2urls(u[0],'srl')#uはリストなので要素が一つでも[0]と指定必要
        u = u[1]#srlはこの時は49得たので[0]から[48]指定できる
        print(srl2bb8yymmdd(u))
        u = url2urls(u,'sde')
        for s in u:
            #[6::7]6列目からステップ7とすることで6列(騎手名)と13列(単勝人気)を得る
            name8pop = [td.text for td in url2soup(s).find_all('tr')[1].find_all('td')[6::7]]
            win = url2soup(s).find('li', class_="win").find('div' , class_="yen").text
            print(name8pop,win)

pythonでJRAレース結果urlをリストして保存する

pythonJRAレース結果urlをリストして保存する
年月を指定して「過去レース結果検索」文字列'pw01skl1'を含むリンクを創る
'pw01skl1'リンクのページから「3回阪神2日」とかの文字列'pw01srl'を含むリンクを得る
'pw01srl'リンクのページから「レース結果」文字列'pw01sde'を含むリンクを得る
pickleで「レース結果」リンクを保存する
一年分のリンク約3400個の保存に5から6分かかる

続きを読む

pythonでJRA出馬表urlからオッズurlを捏造してみた

出馬表urlからオッズurlを捏造してみた
出馬表urlと単勝複勝オッズ(馬番順)urlでは
"/JRADB/accessD.html?CNAME=pw01dde0106202303070120230415/A1"
('/JRADB/accessO.html', 'pw151ouS306202303070120230415Z/44')

続きを読む

JRA内部urlからBeautifulSoupを得る関数

 

JRA内部urlに2種ある
href="#" onclick="return doAction('/JRADB/accessS.html', 'pw01srl10092023020420230402/F2')
href="/JRADB/accessS.html?CNAME=pw01sde1006202303030120230401/22"
これらのurlからBeautifulSoupを得る方法

続きを読む

PythonでJRA内部urlからBeautifulSoupでデータを得る

 

JRAホームページで右クリックで[リンクのアドレスをコピー]を選択しても ”https://www.jra.go.jp/JRADB/accessS.html#”しか得られない

続きを読む

JRAのHPにアクセス

 

Sub Main1
Dim objIE As Object 
Set objIE = CreateObject("internetexplorer.application")
objIE.Visible =true'false
objIE.navigate "http://www.jra.go.jp"
Do While objIE.Busy Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
End Sub

 「レース結果」に跳んで、さらに「過去レース検索画面」に跳ぶ

Sub Main2
Dim objIE As Object 
Set objIE = CreateObject("internetexplorer.application")
objIE.Visible =true'false
objIE.navigate "http://www.jra.go.jp"
Do While objIE.Busy Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop

For Each objA In objIE.Document.all.tags("A")
If InStr(objA.outerHTML, "レース結果") > 0 Then
objA.Click
exit for
end if
next
Do While objIE.Busy Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop

For Each objA In objIE.Document.all.tags("A")
If InStr(objA.outerHTML, "過去レース検索画面はこちらをご覧ください。") > 0 Then
objA.Click
exit for
end if
next
Do While objIE.Busy Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
End Sub

「 Do While ・・・Loop」と「For Each ・・・next」をFunction化する

Main2をFunction入りに書き換え

Function ReadyState(ByRef objIE As Object)
Do While objIE.Busy Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
'wait(500) '0.5 秒 (500 ミリ秒) 
End Function

Function Link(ByRef moji As string , objIE As Object )
For Each objLink In objIE.document.Links
If InStr(objLink.outerHTML, moji) > 0 Then
objLink.Click
exit for
end if
next
Do While objIE.Busy Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
'Wait (500) '0.5 秒 (500 ミリ秒)
End Function

Sub Main3
Dim objIE As Object 
Set objIE = CreateObject("internetexplorer.application")
objIE.Visible =true'false
objIE.navigate "http://www.jra.go.jp"
call ReadyState(objIE)
call Link("レース結果" , objIE)
call Link("過去レース検索画面はこちらをご覧ください。" , objIE)
End Sub

「For Each ・・・next」では時間が掛かるので

ソースからパラメータをコピーしてobjIE.navigate に貼り付け

Sub Main4
Dim objIE As Object 
Set objIE = CreateObject("internetexplorer.application")
objIE.Visible =true'false
objIE.navigate "http://www.jra.go.jp"
call ReadyState(objIE)
objIE.navigate "JavaScript:doAction('/JRADB/accessS.html','pw01skl00999999/B3')"
call ReadyState(objIE)
End Sub

過去レース検索画面で年・月を入力する

Sub Main5
Dim objIE As Object 
Set objIE = CreateObject("internetexplorer.application")
objIE.Visible =true'false
objIE.navigate "http://www.jra.go.jp"
call ReadyState(objIE)
yy=2018
mm=8
ThisYear=Format(Date,"yyyy")
yIndex=ThisYear-yy
mIndex=mm-1
objIE.navigate "JavaScript:doAction('/JRADB/accessS.html','pw01skl00999999/B3')"
call ReadyState(objIE)
objIE.Document.all.tags("SELECT")(0).selectedIndex =yIndex
objIE.Document.all.tags("SELECT")(1).selectedIndex =mIndex
objIE.Document.all.tags("A")(104).Click
call ReadyState(objIE)

srlParam=LinksParamArry("srl", objIE)
for n=0 to Ubound(srlParam)
msgbox srlParam(n)
next
End Sub

 

Function LinksParamArry(ByRef KeyWd As string, objIE As Object)As Variant 
dim Param() as string
For Each objLink In objIE.document.Links
If InStr(objLink.outerHTML,KeyWd) > 0 Then
outH=objLink.outerHTML
kac1=InStr(outH, "(")
kac2=InStr(outH, ")")
ReDim Preserve Param(n)
Param(n)="JavaScript:doAction" & mid(outH,kac1,(kac2-kac1)+1) 
n=n+1
end if
next
LinksParamArry=Param
End Function