■
pythonでJRAの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)
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