天鳳からログデータを取得するプログラムまとめ

# ※この記事は2020年に作成しました
# 天鳳ログデータを取得する概要
下記から天鳳のログデータが圧縮されたファイルをダウンロードする。
https://tenhou.net/sc/raw/

ダウンロードしてきたファイルはgzipで、圧縮された中に大量のHTMLファイルが入っている。
そのHTMLの中には過去の牌譜の観戦用URLが大量に入っている。
観戦用URL：http://tenhou.net/0/?log=【牌譜ID】
実際にデータがある場所のURL:http://tenhou.net/0/log/?【牌譜ID】
実際のデータがある場所にログがXMLで書かれている。

手順としては、下記の1から4でログデータを取得する。
①gzipファイルからHTMLをテキストファイルとして保存するプログラム
　gzipの中にあるHTMLをテキストファイルとして保存

②上記のテキストファイルからURL部分のみを抽出するプログラム
　HTMLのテキストファイルから観戦用URLの書かれている部分のみを取り出してテキストとして保存している

③観戦用URLからデータの書かれているXMLファイルのURLを生成するプログラム
　観戦用URLだけ書かれているテキストファイルから、XMLのURLを作成しテキストファイルとして保存している

④そのXMLの書かれているURLからXMLファイルを取得するプログラム
　URLにXMLファイルを取得して保存している

# ①
gzipファイルからHTMLをテキストファイルとして保存するプログラム

```python
# coding: utf-8
import os
import tarfile
import gzip
files = os.listdir('D:/2018-08/gz/')
for file in files:
    origin = "D:/2018-08/gz/" + file
    name = file
    name = name[:-8]
    filename = "D:/2018-08/url-txt/"+name+".txt"
    print (filename)
    f1 = gzip.open(origin,'rb')
    f2 = open(filename,'w')
    _line = f1.readline()
    
    while _line:
        _text = _line.decode('utf-8')
        f2.write(_text)
        _line = f1.readline()

    f1.close()
    f2.close()
'''
ダウンロードしてきたファイルにはgzipで圧縮された中に大量のHTMLファイルが入っている
5:listdirは指定したファイルのディレクトリをリストにして一覧で取得する
'''
```

# ②
上記のテキストファイルからURL部分のみを抽出するプログラム

```python
# coding: utf-8
import os
import tarfile
import gzip
files = os.listdir('D:/2018-08/url-txt/')

for file in files:
    origin = "D:/2018-08/url-txt/" + file
    name = file
    name = name[:-4]
    filename = "D:/2018-08/txt/url"+name+".txt"
    print (filename)
    f1 = open(origin,'r')#,encoding='utf-8')
    f2 = open(filename,'w')#,encoding='utf-8')

    _text = f1.readline()
    while _text:
        f2.write(_text[31:87])
        _text = f1.readline()
        if _text != "\n":
            f2.write("\n")
    f1.close()
    f2.close()
```

# ③
観戦用URLからデータの書かれているXMLファイルのURLを生成するプログラム

```python
# coding: utf-8
import os
import tarfile
import gzip
files = os.listdir('D:/2018-08/txt/')

for file in files:
    origin = "D:/2018-08/txt/" + file
    name = file
    name = name[3:-4]
    filename = "D:/2018-08/id-txt/"+name+"ID.txt"
    print (filename)
    f1 = open(origin,'r',encoding='utf-8')
    f2 = open(filename,'w',encoding='utf-8')

    _text = f1.readline()
    while _text:
        f2.write(_text[:20])
        f2.write(_text[21:24])
        f2.write("/?")
        f2.write(_text[25:61])
        _text = f1.readline()

    f2.write('\n')
    f1.close()
    f2.close()
```

# ④
そのXMLの書かれているURLからXMLファイルを取得するプログラム
天鳳のサイトにアクセスするので、連続でファイルを取得する場合はtime.sleep()で時間を置いたほうが良い。

```python
# coding: utf-8
import os
import tarfile
import urllib
import requests
import time
import sys
files = os.listdir('D:/2018-08/id-txt03/')
j = 0
for file in files:
    name = file
    f1 = open("D:/2018-08/id-txt03/"+name,'r',encoding='utf-8')
    lines = f1.readlines()
    f1.close()
    f1 = open("D:/2018-08/id-txt03/"+name,'r',encoding='utf-8')
    for i in lines :
        xml = f1.readline()
        if xml =='\n':
            break
        text = xml[:-1]
        text_url = xml[7]
        filename = "D:/2018-08/xml03/"+text[25:]+".xml"
        f2 = open(filename,'w',encoding='utf-8')
        headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36'}
        res=requests.get(url=text, headers=headers)
        f2.write(res.text)
        f2.close()
        #time.sleep(0.1)
        j = j+1
        print(filename)
    f1.close()
    #sys.exit()
    #time.sleep(5)
```