山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

天鳳のログから和了形を抽出する その1

天鳳

tenhou.net

最近ブログの更新をさぼっていましたが、裏では麻雀で遊んでいました。プログラミングに関しては、麻雀の点数計算のプログラムを書いていました。そこで、テストケースが必要になってので、天鳳のログから和了形と点数を抽出しようと思います。

同じことをしたい人は、

www.barbaroiware.net

が参考になるので、そちらを見てください。

ログ

天鳳のログのページには、ログのzipファイルのリンクが置かれているので、そこからダウンロードして解凍します。

フォルダの中には、html形式とlog形式のファイルがありますが、ここではhtml形式のファイルを使います。

f:id:yamakasa3:20200227231113p:plain

HTMLファイル

HTMLファイルは次の画像のようになっています。

f:id:yamakasa3:20200227231534p:plain

牌譜というリンクを辿ると、その対局の牌譜を見ることができます。

コンソール上では、

['00:02', '|', '28', '|', '四鳳南喰赤-', '|', '<a', 'href="http://tenhou.net/0/?log=2018010100gm-00a9-0000-257139d7">牌譜</a>', '|', 'まきし(本垢1)(+49.0)', 'みっきー(+3.0)', '真エトペン(-18.0)', 'かき氷(-34.0)<br>\n']

のように表示されています。天鳳の牌譜をXMLで取得するには、

http://tenhou.net/0/?log=2018010100gm-00a9-0000-257139d7

http://tenhou.net/0/log/?2018010100gm-00a9-0000-257139d7

に変換してやる必要があります。

XMLからAGARIタグを抽出する

正規表現で抜き出しても良いと思いますが、その場しのぎのコードとなっています。

.gz となっているファイルは、gzip を使って開きます。

import os
import gzip
from lxml import html
import requests
import lxml

from bs4 import BeautifulSoup

script_dir = script_dir = os.path.abspath(os.path.dirname(__file__))
path = os.path.join(script_dir, "../tenhou_log/2018/scc20180101.html.gz")

idx = len('href="http://tenhou.net/0/?log=')

agari_data = []

with gzip.open(path, "rt", encoding="utf_8") as f:
    line = f.readline()
    print(line)
    while(line):
        v = line.split(" ")
        # 三麻を除く 
        if '三' in v[4]:
            line = f.readline()
            continue
        url = 'http://tenhou.net/0/log/?' + v[7][idx : len(v[7]) - 8]
        r = requests. get(url)
        html = lxml.html.fromstring(r.text)
        soup = BeautifulSoup(r.text, 'lxml-xml')
        data = soup.find_all("AGARI")
        for d in data:
            agari_data.append(d)
        line = f.readline()

上記のコードでは、5045回の上がりがありました。

AGARIタグの内容は次のようになっています。

<AGARI ba="0,0" doraHai="22" fromWho="3" hai="8,10,11,50,53,57,81,86,88,97,98" m="49771" machi="86" sc="224,0,237,0,237,20,302,-20" ten="30,2000,0" who="2" yaku="19,1,54,1"/>