Part1:競艇の成績データをCSVにまとめる

f:id:tamurasann:20190903231746j:plain

pythonを使って、競艇の成績データをCSVへ吐き出してみました。

 

下記のURLに記載されている情報をpythonを使って、CSVへ吐き出しました。

f:id:tamurasann:20190903232102p:plain

www.boatrace.jp

 

結果

f:id:tamurasann:20190903232208p:plain

CSVに吐き出すと上記のような形となりました。

 

コード全体


import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd

#URLの取得
url = "https://www.boatrace.jp/owpc/pc/data/record/listdetail?category=2600&record_no=20"
html = urlopen(url)
bsObj = BeautifulSoup(html, "html.parser")

#titleの取得
title = bsObj.findAll("tr", {"class":"is-fs14"})[0]
title_text = title.get_text()
title_split = title_text.splitlines()

#titleをファイルへ書き込む
with open("D:/競艇/" + "data" + ".csv", "a", newline ="", encoding='utf-8_sig') as f:
    writer = csv.writer(f,lineterminator='\n') 
    writer.writerow(title_split)

#contentsの取得
for i in bsObj.findAll("tr", {"class":"is-p10-0"}):
    contents_text = i.get_text()
    contents_split = contents_text.splitlines()

#contentsをファイルへ書き込む
    with open("D:/競艇/" + "data" + ".csv", "a", newline ="", encoding='utf-8_sig') as f:
        writer = csv.writer(f,lineterminator='\n') # 行末は改行
        writer.writerow(contents_split)

#ファイルの編集
df = pd.read_csv("D:/競艇/" + "data" + ".csv", header=None)
df2 = df.drop(df.columns[[0, 11]], axis=1)
df2.to_csv("D:/競艇/" + "data" + ".csv", encoding="utf-8_sig")

コード解説

下記のコードでは対象のURLを指定し、Beautifulsoupで解析しております。

url = "https://www.boatrace.jp/owpc/pc/data/record/listdetail?category=2600&record_no=20"

html = urlopen(url)

bsObj = BeautifulSoup(html, "html.parser")

 

下記のコードではtitleを取得しております。get_textは、テキストのみ取得したい場合、使用します。splitlinesはデフォルトで改行されている場合は、分割して返してくれます。

f:id:tamurasann:20190903232937p:plain

f:id:tamurasann:20190903233031p:plain

title = bsObj.findAll("tr", {"class":"is-fs14"})[0]

title_text = title.get_text()

title_split = title_text.splitlines()

 

下記のコードではtitleを一旦、ファイルへ書き込んでおります。

with open("D:/競艇/" + "data" + ".csv", "a", newline ="", encoding='utf-8_sig') as f:

writer = csv.writer(f,lineterminator='\n')

writer.writerow(title_split)

 

下記のコードではcontentsを取得しております。6行あるのでfor文で繰り返し処理を行います。

f:id:tamurasann:20190903233254p:plain

f:id:tamurasann:20190903233346p:plain

for i in bsObj.findAll("tr", {"class":"is-p10-0"}):

contents_text = i.get_text()

contents_split = contents_text.splitlines()

 

下記のコードではcontentsをファイルへ書き込んでいます。

with open("D:/競艇/" + "data" + ".csv", "a", newline ="", encoding='utf-8_sig') as f:

writer = csv.writer(f,lineterminator='\n')

writer.writerow(contents_split)

 

下記のコードではpandasを使って、いらない列を削除しております。

df = pd.read_csv("D:/競艇/" + "data" + ".csv", header=None)

df2 = df.drop(df.columns[[0, 11]], axis=1)

df2.to_csv("D:/競艇/" + "data" + ".csv", encoding="utf-8_sig")

 

終わりに

 

天候や風速、風向、波高情報、大会名などもCSVで綺麗にまとめることができれば実用的なものになるのかなと思います。Part2ではそこを課題として取り組んでいきます。

f:id:tamurasann:20190903234028p:plain


また、下記のnoteにもはてなブログでは書けない記事も書いておりますのでぜひ、ご参照ください。

note.mu