情報系人間のブログ

プログラミング、開発に関することを書いていきます。

プロ野球の結果をスクレイピングする

スクレイピングについて勉強したいと思いプロ野球の結果を取得するコードを書いてみました。
データ取得元はこちら
スポーツナビ

Rubyで書いたのですが、nokogiriというライブリが非常に便利でした。
最低限動くだけならかなり簡単に書くことができますし、かなり実用的だと思います。
ですかスクレイピングは法律関係が色々あるので実際使うとなると難しいですね。

scrape.rb

# -*- coding: utf-8 -*-
require 'mechanize'
require 'nokogiri'

date = ARGV[0]

page = Mechanize.new.get("http://baseball.yahoo.co.jp/npb/schedule/?&date=" + date)
doc = Nokogiri::HTML.parse(page.body)

doc.xpath('//table[@class="yjMS mb5"]/tr').each do |node|
  
  # team
  node.xpath('td[@class="today pl7"]/a').each do |elem|
    p elem.text
  end

  # startTime ballPark
  node.xpath('td[@class="today pl7"]/em').each do |elem|
    /(\d{2}:\d{2})(.+)/ =~ elem.text
    p $1
    p $2.gsub(" ", "")   
  end

  # score inning
  node.xpath('td[@class="today ct"]').each do |elem|
    if /(\d+) - (\d+)/ =~ elem.text
      p $1
      p $2
      p elem.text
    end

    elem.xpath('a').each do |inning|
      p inning.text
    end
  end

  # pitchers
  node.xpath('td[@class="today"]/table/tr').each do |elem|
    p elem.xpath('td[@class="w"]').text.gsub(/[[:space:]]/,"")
    p elem.xpath('td[@class="s"]').text.gsub(/S[[:space:]]/,"")
    p elem.xpath('td[@class="l"]').text.gsub(/[[:space:]]/,"")
  end
  
end

使い方
引数に日付をYYYYMMDD形式で指定します。

ruby scrape.rb 20150823

出力

ホームチーム
アウェイチーム
開始時間
球場
ホームチームの得点
アウェイチームの得点
試合のスコア
進行状況
勝利投手
セーブ投手
敗戦投手

が出力されます。