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)