ウマ娘をやってて、ミッションなどで特定のレースに出走する必要があったりする場合、そのレースがいつ開催されるのか、そしてそのミッションをクリアしたかどうかをアプリで管理できたら良いと思いませんか?
まぁ、大手攻略サイトと、TODOリストアプリ使えばいいんですが、Pythonのコーディング練習とか含めてやってみようと思います。
スクレイピングや、tkinterの使い方のメモなどになればいいかなと。
手順
- スクレイピングでレースデータを取得【今回やる】
- データを使ってGUIアプリケーションを作る(検索&TODOリスト登録)
使用開発環境
- Python 3.8.3
- beautifulsoup4 4.9.1
- pandas 1.0.5
- エディタ:VScode
スクレイピングでレースデータを取得
レースデータを一つ一つ入力していくのは時間がかかるのでGame With様から取得させていただきます。
サイトはこちら。
ただ、スクレイピングをする上で自分が気をつけているのは、「インターネット上にある誰かのデータを借りている」「データ取得のリクエストにはサーバーに負担をかけている」ということを意識することです。
なので簡単に実行できないようにURLや内部のクラス名などは明記しません。
from bs4 import BeautifulSoup
import requests
import pandas as pd
URL=''
RACE_CLASS=''
# リクエスト&読み込み
load_url = URL
html = requests.get(load_url)
soup = BeautifulSoup(html.content, 'html.parser')
lis_td = [] # td要素を入れるためのリスト
lis_a = [] # a要素を入れるためのリスト
# レース毎に設定されてるクラスから一つずつ取り出す
for element in soup.find_all(class_=RACE_CLASS):
# 要素内のデータを整形して、項目毎のレースデータを作成
lis = [i.text for i in element.find_all('td')]
lis_td.append(lis[0].split(' ') + lis[1].split(' / '))
lis_a.append([i.text for i in element.find_all('a')])
# 空リストを削除する
while [] in lis_a:
i = lis_a.index([])
lis_a.pop(i)
lis_td.pop(i)
# リスト内の空要素を削除
lis_a = [i[1] for i in lis_a]
# データフレーム形式でデータを整形
df = pd.DataFrame(lis_td, columns=RACE_COLUMNS)
se = pd.Series(lis_a)
df['レース名'] = se
# 出力
df.to_csv(OUTPUT_CSV)
ソースコードの細かい処理などはコード内のコメントを見てください。
参考文献
- 【ウマ娘】レース一覧 - ゲームウィズ(GameWith)
- PythonでHTMLを解析してデータ収集してみる? スクレイピングが最初からわかる『Python 2年生』
- 米国データサイエンティストがやさしく教えるデータサイエンスのためのPython講座(Pandasの説明がわかりやすいコースです)