pythonでJRA出馬表urlからオッズurlを捏造してみた
出馬表urlからオッズurlを捏造してみた
出馬表urlと単勝・複勝オッズ(馬番順)urlでは
"/JRADB/accessD.html?CNAME=pw01dde0106202303070120230415/A1"
('/JRADB/accessO.html', 'pw151ouS306202303070120230415Z/44')
'accessD'が'accessO'に変わり
'06202303070120230415'は同じで
'pw01dde01'が'pw151ouS3'に変わり
'/'が'Z/'に変わり
末尾16進数'A1'が'44'に変わる
'A1'から'44'の加算数は10進数で-93 マイナスは気持ち悪いので+256して163
単勝・複勝オッズ(馬番順)以外の置き換記号、加算数も調べ変換関数を作った
'/'が'Z/'以外の変換もあったのでifで逃げた
import requests
from bs4 import BeautifulSoup
#JRAの内部url('/JRADB/***', 'pw***')からBeautifulSoupを得る関数
def url2soup(url):
arg1 = url[0]
arg2 = url[1]
r = requests.post("https://www.jra.go.jp/"+arg1, data='cname='+arg2)
r.encoding = 'Shift_jis'
return BeautifulSoup(r.text, 'lxml')
#出馬表urlから各種オッズurlを得る関数
def odd_urls(dde_url , n):
dde_cd_int = int(dde_url[-2:] , 16)
odd_param = [
(0, '単勝・複勝オッズ(馬番順)', 'pw151ouS3', 163),
(1, '枠連オッズ(枠番順)', 'pw153ouS3', 171),
(2, '馬連オッズ(馬番順)', 'pw154ouS3', 47),
(3, 'ワイドオッズ(馬番順)', 'pw155ouS3', 179),
(4, '馬単オッズ(馬番順)', 'pw156ouS3', 55),
(5, '3連複オッズ(馬番順)', 'pw157ouS3', 29),
(6, '3連単オッズ(馬番順)', 'pw158ouS3', 63),
(7, '単勝・複勝オッズ(人気順)', 'pw151opS3', 197),
(8, '枠連オッズ(人気順)', 'pw153opS3', 141),
(9, '馬連オッズ(人気順)', 'pw154opS3', 17),
(10, 'ワイドオッズ(人気順)', 'pw155opS3', 149),
(11, '馬単オッズ(人気順)', 'pw156opS3', 25),
(12, '3連複オッズ(人気順)', 'pw157opS3', 221),
(13, '3連単オッズ(人気順)', 'pw158opS3', 97)]
dde_body = dde_url.split('?CNAME=')[1][:-3]
odd_body = dde_body.replace('pw01dde01' , odd_param[n][2])
odd_body_with_cd = odd_body + 'Z/' + hex(dde_cd_int + odd_param[n][3]).upper()[-2:]
if n == 5:
odd_body_with_cd = odd_body + 'Z99/' + hex(dde_cd_int + odd_param[n][3]).upper()[-2:]
if 7 < n < 12:
odd_body_with_cd = odd_body + 'Z1/' + hex(dde_cd_int + odd_param[n][3]).upper()[-2:]
return ('/JRADB/accessO.html' , odd_body_with_cd)
url = 'https://www.jra.go.jp/JRADB/accessD.html?CNAME=pw01dde0106202303070120230415/A1'
for n in range(14):
print(url2soup(odd_urls(url , n)).find('title').text[:-4])
置き換記号、加算数を調べた備忘
import requests
from bs4 import BeautifulSoup
import re
import pprint
#JRAの内部url('/JRADB/***', 'pw***')からBeautifulSoupを得る関数
def url2soup(url):
arg1 = url[0]
arg2 = url[1]
r = requests.post("https://www.jra.go.jp/"+arg1, data='cname='+arg2)
r.encoding = 'Shift_jis'
return BeautifulSoup(r.text, 'lxml')
#JRA出馬表ページで[リンクのアドレスをコピー]で適当な出馬表urlを得る
url = 'https://www.jra.go.jp/JRADB/accessD.html?CNAME=pw01dde0106202303070120230415/A1'
#urlのチェックデジット(以下cd)の16進を10進変換
dde_cd_int = int(url[-2:] , 16)
#requestsで出馬表ページのBeautifulSoupを得る
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
links = soup.find_all('a')
#出馬表ページのオッズリンクurlを得る
o_links = [[re.findall(r'/J.+html', str(l))[0],
re.findall(r'p.+/[0-9a-fA-F]{2}', str(l))[0]]
for l in links if 'Z/' in str(l)]
# BeautifulSoupを得る関数[url2soup]にオッズリンクurlを渡す
soup = url2soup(o_links[0])
#ulリストからリンクを得る
links = soup.find('ul' , class_="nav pills mt10").find_all('a')
#リストのhtmlから馬番順urlを得る
ou_links = [[re.findall(r'/J.+html', str(l))[0],
re.findall(r'p.+/[0-9a-fA-F]{2}', str(l))[0]]
for l in links]
#馬番順urlを関数[url2soup]に渡して人気順urlリストを得る
op_links =[[re.findall(r'/J.+html', str(a))[0],
re.findall(r'p.+/[0-9a-fA-F]{2}', str(a))[0]]
for ou in ou_links for a in url2soup(ou).find_all('a')if '人気順' in a.text]
#馬番、人気リスト結合
oall_link = ou_links + op_links
#オッズ種名リストを作る
type = [url2soup(o).find('title').text.replace('\u3000JRA', '') for o in oall_link]
#オッズ記号リストを作る
pwx = [o[1][:9] for o in oall_link]
#各urlのcdから成績表urlのcdを引きcd加算数リストをつくる
sub = [int(str(oall[1])[-2:] , 16) - dde_cd_int for oall in oall_link]
#一部マイナスで、そのままでもいいが256加算でプラスにする
add = [s if s >= 0 else s + 256 for s in sub]
#連番リストを作る
no = list(range(14))
#連番、オッズ種名、記号、演算数値をリスト結合する
no_type_pwx_add = list(zip(no, type, pwx, add))
pprint.pprint(no_type_pwx_add)