LoginSignup
0
1

More than 1 year has passed since last update.

Wikipediaの情報をCSVに保存し、Railsで活用

Last updated at Posted at 2021-03-05

野球選手のデータを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()

スクリーンショット 2021-03-05 17.09.53.jpg

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 %>

4.結果

こんな感じに表示することができました。
スクリーンショット 2021-03-05 17.26.22.jpg

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1