野球選手のデータをRailsで扱いたかったんですが、活用できるAPIがなかったので自力で集めてみました。
PythonはGoogleColaboratoryを使用してます。
0.流れ
Wikipediaの情報をGoogleColaboratoryからスクレイピング
↓
データを整え、CSVに保存
↓
Railsのデータベースに保存
↓
表示する
1.スクレイピング
準備
import requests
import pandas as pd
from bs4 import BeautifulSoup
# 広島東洋カープの選手一覧
url = "https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E6%9D%B1%E6%B4%8B%E3%82%AB%E3%83%BC%E3%83%97%E3%81%AE%E9%81%B8%E6%89%8B%E4%B8%80%E8%A6%A7"
データの取得
df = pd.read_html(url)
df[5].head()
df[4]には投手の情報が入っています。
df[5],[6],[7]に捕手、内野手、外野手の情報が入っているので、野手として1つにまとめます。
df_fielder = pd.concat([df[5], df[6], df[7]], ignore_index=True) #新たに行番号の割り当てのオプション
df_fielder["field"] = "F"
df[4]["field"] = "P"
カラム名を英語表記に変更
df_player = pd.concat([df_fielder, df[2]], ignore_index=True)
df_player.rename(columns={"背番号":"number", "選手名":"player_name", "投":"hand", "打":"bat"}, inplace=True)
df_after_player=df_player.drop("備考", axis=1)
df_after_player["team"]="C" #カープ
df_after_player["league"]="S" #セ・リーグ
2.CSV保存
from google.colab import files
import datetime
# ファイル名に日時を挿入
dt_now = datetime.datetime.now()
dt = dt_now.strftime('%Y%m%d%H%M%S')
file_name = "Carp_"+ dt + ".csv"
# CSVに変換
df_fielder.to_csv(file_name, index=False)
# CSVファイルのダウンロード
files.download(file_name)
3.Rails
モデルの作成
$ rails g model Player number:integer player_name:string hand:string bat:string team:string
CSVの情報をデータベースに保存
require 'csv'
CSV.foreach("Carp_20210304124010.csv", headers: true) do |row| #「headers: true」先頭行をヘッダーとするので、rowには入らない
Player.create!(
# rowには、["22", "中村奨成", "右", "右", "C"]と各選手の情報が入っている。
number: row[0].to_i, #ファイル内で文字列になっていたため数値へ変換
player_name: row[1],
hand: row[2],
bat: row[3],
field: row[4],
team: row[5],
league: row[6]
)
end
puts "Finish!"
コントローラの作成
$ rails g controller Players index
コントローラからDBの情報を取得
class PlayersController < ApplicationController
def index
@players = Player.all
end
end
ビューで表示
<% @players.each do |player| %>
<li style="list-style: none">
<%= player.number %>
<%= player.player_name %>
<%= player.hand %>
<%= player.bat %>
<%= player.team %>
</li>
<% end %>