npb_api 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/npb_api/game.rb +80 -0
- data/lib/npb_api.rb +8 -0
- metadata +51 -12
- data/lib/npb_api/base.rb +0 -23
- data/lib/npb_api/fielding.rb +0 -89
- data/lib/npb_api/hitting.rb +0 -81
- data/lib/npb_api/pitching.rb +0 -108
- data/lib/npb_api/table_extraction.rb +0 -25
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4e803a0b961d518feeeed96ca41a8054a88097af
|
|
4
|
+
data.tar.gz: 5350d4a294585a75bd8056e55e338c24065f15d0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0d4c2e2fb7a7fbf36e37b76aef97c8232b83a4b5ec0f82d9142089f79773564bbd1235ef89b99195e2d779e7641dec9d65019057000abe866d366ddd68f96d94
|
|
7
|
+
data.tar.gz: 891f85e1f161252cd9d1ae53d33d136198d73f3f97cb9d14f42bd5210c8045afcf29f6f00d7b985c69e27cd93d9728a3b7acea5d6af816b61bef23db9b8b286d
|
data/lib/npb_api/game.rb
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
class NpbApi::Game
|
|
2
|
+
def initialize(date: '', id: '')
|
|
3
|
+
@date = date
|
|
4
|
+
@game_id = date.year.to_s + format('%02d', date.month) + format('%02d', date.day) + id
|
|
5
|
+
@doc = Nokogiri::HTML(open("http://baseball.yahoo.co.jp/npb/game/#{@game_id}/top"))
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def away
|
|
9
|
+
{
|
|
10
|
+
game_id: @game_id,
|
|
11
|
+
status: status,
|
|
12
|
+
team: @doc.css('.column-right.clearfix i').text,
|
|
13
|
+
score: away_score,
|
|
14
|
+
result: away_result,
|
|
15
|
+
datetime: datetime,
|
|
16
|
+
ballpark: ballpark
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def home
|
|
21
|
+
{
|
|
22
|
+
game_id: @game_id,
|
|
23
|
+
status: status,
|
|
24
|
+
team: @doc.css('.column-left.clearfix i').text,
|
|
25
|
+
score: home_score,
|
|
26
|
+
result: home_result,
|
|
27
|
+
datetime: datetime,
|
|
28
|
+
ballpark: ballpark
|
|
29
|
+
}
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def status
|
|
35
|
+
@doc.css('.column-center em').text
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def away_score
|
|
39
|
+
return nil if status == '試合前中止'
|
|
40
|
+
@doc.css('tr#tb1 td.sum').text.to_i
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def away_result
|
|
44
|
+
return 'postponed' if status.include?('中止')
|
|
45
|
+
|
|
46
|
+
if away_score > home_score
|
|
47
|
+
'win'
|
|
48
|
+
elsif away_score < home_score
|
|
49
|
+
'lose'
|
|
50
|
+
else
|
|
51
|
+
'draw'
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def home_score
|
|
56
|
+
return nil if status == '試合前中止'
|
|
57
|
+
@doc.css('tr#tb2 td.sum').text.to_i
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def home_result
|
|
61
|
+
return 'postponed' if status.include?('中止')
|
|
62
|
+
|
|
63
|
+
if home_score > away_score
|
|
64
|
+
'win'
|
|
65
|
+
elsif home_score < away_score
|
|
66
|
+
'lose'
|
|
67
|
+
else
|
|
68
|
+
'draw'
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def datetime
|
|
73
|
+
hour, minute = @doc.css('p.stadium').children[2].text.split(':').map(&:to_i)
|
|
74
|
+
DateTime.new(@date.year, @date.month, @date.day, hour, minute, 0, '+9')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def ballpark
|
|
78
|
+
@doc.css('p.stadium').children[0].text.strip
|
|
79
|
+
end
|
|
80
|
+
end
|
data/lib/npb_api.rb
ADDED
metadata
CHANGED
|
@@ -1,27 +1,66 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: npb_api
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ohtsuka Takahiro
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-
|
|
12
|
-
dependencies:
|
|
13
|
-
|
|
11
|
+
date: 2016-05-21 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: table_extraction
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '11'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '11'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: minitest
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '5'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '5'
|
|
55
|
+
description: npbのデータを取得する
|
|
14
56
|
email: t.o.0526@gmail.com
|
|
15
57
|
executables: []
|
|
16
58
|
extensions: []
|
|
17
59
|
extra_rdoc_files: []
|
|
18
60
|
files:
|
|
19
|
-
- lib/npb_api
|
|
20
|
-
- lib/npb_api/
|
|
21
|
-
|
|
22
|
-
- lib/npb_api/pitching.rb
|
|
23
|
-
- lib/npb_api/table_extraction.rb
|
|
24
|
-
homepage: http://rubygems.org/gems/npb_api
|
|
61
|
+
- lib/npb_api.rb
|
|
62
|
+
- lib/npb_api/game.rb
|
|
63
|
+
homepage: https://github.com/to0526/npb_api
|
|
25
64
|
licenses:
|
|
26
65
|
- MIT
|
|
27
66
|
metadata: {}
|
|
@@ -41,8 +80,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
41
80
|
version: '0'
|
|
42
81
|
requirements: []
|
|
43
82
|
rubyforge_project:
|
|
44
|
-
rubygems_version: 2.
|
|
83
|
+
rubygems_version: 2.5.1
|
|
45
84
|
signing_key:
|
|
46
85
|
specification_version: 4
|
|
47
|
-
summary:
|
|
86
|
+
summary: npbのデータを取得する
|
|
48
87
|
test_files: []
|
data/lib/npb_api/base.rb
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
require './lib/npb_api/table_extraction'
|
|
2
|
-
|
|
3
|
-
class NpbApi::Base
|
|
4
|
-
def initialize(team: '', year: '', league: '')
|
|
5
|
-
@team = team
|
|
6
|
-
@year = year
|
|
7
|
-
@league = league
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def table
|
|
11
|
-
raise NotImplementedError
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
private
|
|
15
|
-
|
|
16
|
-
def extracted_table
|
|
17
|
-
raise NotImplementedError
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def url
|
|
21
|
-
raise NotImplementedError
|
|
22
|
-
end
|
|
23
|
-
end
|
data/lib/npb_api/fielding.rb
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
require './lib/npb_api/base'
|
|
2
|
-
|
|
3
|
-
module NpbApi
|
|
4
|
-
class Fielding < Base
|
|
5
|
-
def table
|
|
6
|
-
position = ''
|
|
7
|
-
extracted_table.map do |values|
|
|
8
|
-
if values[0] =~ /\A【(.+)】\z/
|
|
9
|
-
position = human_position($1)
|
|
10
|
-
next
|
|
11
|
-
end
|
|
12
|
-
values.unshift(@year, @team, @league, position)
|
|
13
|
-
_hash(keys, values).map do |key, value|
|
|
14
|
-
case key
|
|
15
|
-
when :throw
|
|
16
|
-
[key, _throw(value)]
|
|
17
|
-
when :year, :team, :league, :position, :player
|
|
18
|
-
[key, value]
|
|
19
|
-
when :fielding_percentage
|
|
20
|
-
[key, value.to_f]
|
|
21
|
-
when :passed_balls
|
|
22
|
-
[key, (value.empty? ? 'NULL' : value.to_i)]
|
|
23
|
-
else
|
|
24
|
-
[key, value.to_i]
|
|
25
|
-
end
|
|
26
|
-
end.to_h
|
|
27
|
-
end.compact
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
private
|
|
31
|
-
|
|
32
|
-
def extracted_table
|
|
33
|
-
table = TableExtraction.new(url: url).tables.first
|
|
34
|
-
table.delete_at(0)
|
|
35
|
-
table
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def url
|
|
39
|
-
case @league
|
|
40
|
-
when 'CL', 'PL'
|
|
41
|
-
"http://npb.jp/bis/#{@year}/stats/idf1_#{@team.downcase}.html"
|
|
42
|
-
when 'WL', 'EL'
|
|
43
|
-
"http://npb.jp/bis/#{@year}/stats/idf2_#{@team.downcase}.html"
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def keys
|
|
48
|
-
[
|
|
49
|
-
:year,
|
|
50
|
-
:team,
|
|
51
|
-
:league,
|
|
52
|
-
:position,
|
|
53
|
-
:throw,
|
|
54
|
-
:player,
|
|
55
|
-
:games,
|
|
56
|
-
:putout,
|
|
57
|
-
:assists,
|
|
58
|
-
:errors,
|
|
59
|
-
:double_plays,
|
|
60
|
-
:passed_balls,
|
|
61
|
-
:fielding_percentage
|
|
62
|
-
]
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def human_position(position)
|
|
66
|
-
case position
|
|
67
|
-
when '一塁手' then '1B'
|
|
68
|
-
when '二塁手' then '2B'
|
|
69
|
-
when '三塁手' then '3B'
|
|
70
|
-
when '遊撃手' then 'SS'
|
|
71
|
-
when '外野手' then 'OF'
|
|
72
|
-
when '捕手' then 'C'
|
|
73
|
-
when '投手' then 'P'
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def _hash(keys, values)
|
|
78
|
-
Hash[*[keys, values].transpose.flatten]
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def _throw(value)
|
|
82
|
-
case value
|
|
83
|
-
when '' then 'R'
|
|
84
|
-
when '*' then 'L'
|
|
85
|
-
when '+' then 'S'
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
data/lib/npb_api/hitting.rb
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
require './lib/npb_api/base'
|
|
2
|
-
|
|
3
|
-
module NpbApi
|
|
4
|
-
class Hitting < Base
|
|
5
|
-
def table
|
|
6
|
-
extracted_table.map do |values|
|
|
7
|
-
values.unshift(@year, @team, @league)
|
|
8
|
-
hash = Hash[*[keys, values].transpose.flatten]
|
|
9
|
-
hash.map do |key, value|
|
|
10
|
-
case key
|
|
11
|
-
when :bat
|
|
12
|
-
[key, bat(value)]
|
|
13
|
-
when :year, :team, :league, :player
|
|
14
|
-
[key, value]
|
|
15
|
-
when :batting_average, :slugging_percentage, :on_base_percentage
|
|
16
|
-
[key, value.to_f]
|
|
17
|
-
else
|
|
18
|
-
[key, value.to_i]
|
|
19
|
-
end
|
|
20
|
-
end.to_h
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
private
|
|
25
|
-
|
|
26
|
-
def bat(column)
|
|
27
|
-
case column
|
|
28
|
-
when '' then 'R'
|
|
29
|
-
when '*' then 'L'
|
|
30
|
-
when '+' then 'S'
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def extracted_table
|
|
35
|
-
table = TableExtraction.new(url: url).tables.first
|
|
36
|
-
table.slice!(0..1)
|
|
37
|
-
table
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def url
|
|
41
|
-
case @league
|
|
42
|
-
when 'CL', 'PL'
|
|
43
|
-
"http://npb.jp/bis/#{@year}/stats/idb1_#{@team.downcase}.html"
|
|
44
|
-
when 'WL', 'EL'
|
|
45
|
-
"http://npb.jp/bis/#{@year}/stats/idb2_#{@team.downcase}.html"
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def keys
|
|
50
|
-
[
|
|
51
|
-
:year,
|
|
52
|
-
:team,
|
|
53
|
-
:league,
|
|
54
|
-
:bat,
|
|
55
|
-
:player,
|
|
56
|
-
:games,
|
|
57
|
-
:plate_appearances,
|
|
58
|
-
:at_bats,
|
|
59
|
-
:runs,
|
|
60
|
-
:hits,
|
|
61
|
-
:doubles,
|
|
62
|
-
:triples,
|
|
63
|
-
:home_runs,
|
|
64
|
-
:total_bases,
|
|
65
|
-
:runs_batted_in,
|
|
66
|
-
:stolen_bases,
|
|
67
|
-
:caught_stealing,
|
|
68
|
-
:sacrifice_bunts,
|
|
69
|
-
:sacrifice_flies,
|
|
70
|
-
:bases_on_balls,
|
|
71
|
-
:intentional_bases_on_balls,
|
|
72
|
-
:hit_by_pitch,
|
|
73
|
-
:strikeouts,
|
|
74
|
-
:grounded_into_double_playes,
|
|
75
|
-
:batting_average,
|
|
76
|
-
:slugging_percentage,
|
|
77
|
-
:on_base_percentage
|
|
78
|
-
]
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
data/lib/npb_api/pitching.rb
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
require './lib/npb_api/base'
|
|
2
|
-
|
|
3
|
-
module NpbApi
|
|
4
|
-
class Pitching < Base
|
|
5
|
-
def table
|
|
6
|
-
extracted_table.map do |values|
|
|
7
|
-
values.unshift(@year, @team, @league)
|
|
8
|
-
hash = Hash[*[keys, values].transpose.flatten]
|
|
9
|
-
hash = hash.map do |key, value|
|
|
10
|
-
case key
|
|
11
|
-
when :year, :team, :league, :player
|
|
12
|
-
[key, value]
|
|
13
|
-
when :throw
|
|
14
|
-
[key, _throw(value)]
|
|
15
|
-
when :winning_percentage
|
|
16
|
-
[key, value.to_f]
|
|
17
|
-
when :innings_pitched
|
|
18
|
-
[key, innings_pitched(value, hash[:innings_pitched_2])]
|
|
19
|
-
when :earned_run_average
|
|
20
|
-
[key, earned_run_average(value)]
|
|
21
|
-
else
|
|
22
|
-
[key, value.to_i]
|
|
23
|
-
end
|
|
24
|
-
end.to_h
|
|
25
|
-
hash.delete(:innings_pitched_2) # 投球回が2列で表現していたため、一箇所にまとめて小数点の部分を削除
|
|
26
|
-
hash.merge!(hold: 'NULL', hold_points: 'NULL') if farm?
|
|
27
|
-
hash
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
private
|
|
32
|
-
|
|
33
|
-
# ruby の帯域脱出の throw と名前が重複するのでアンダースコアをつけている
|
|
34
|
-
def _throw(column)
|
|
35
|
-
case column
|
|
36
|
-
when '' then 'R'
|
|
37
|
-
when '*' then 'L'
|
|
38
|
-
when '+' then 'S'
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def innings_pitched(innings_pitched_1, innings_pitched_2)
|
|
43
|
-
return innings_pitched_1.to_i if innings_pitched_2.empty?
|
|
44
|
-
"#{innings_pitched_1}#{innings_pitched_2}".to_f
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# 無限大の時は-1を返すようにする
|
|
48
|
-
def earned_run_average(column)
|
|
49
|
-
return -1 if column == '----'
|
|
50
|
-
column.to_f
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def extracted_table
|
|
54
|
-
table = TableExtraction.new(url: url).tables.first
|
|
55
|
-
table.slice!(0..1)
|
|
56
|
-
table
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def url
|
|
60
|
-
case @league
|
|
61
|
-
when 'CL', 'PL'
|
|
62
|
-
"http://npb.jp/bis/#{@year}/stats/idp1_#{@team.downcase}.html"
|
|
63
|
-
when 'WL', 'EL'
|
|
64
|
-
"http://npb.jp/bis/#{@year}/stats/idp2_#{@team.downcase}.html"
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def keys
|
|
69
|
-
keys = [
|
|
70
|
-
:year,
|
|
71
|
-
:team,
|
|
72
|
-
:league,
|
|
73
|
-
:throw,
|
|
74
|
-
:player,
|
|
75
|
-
:games,
|
|
76
|
-
:wins,
|
|
77
|
-
:loses,
|
|
78
|
-
:saves,
|
|
79
|
-
:hold,
|
|
80
|
-
:hold_points,
|
|
81
|
-
:complete_games,
|
|
82
|
-
:shutouts,
|
|
83
|
-
:no_bases_on_balls,
|
|
84
|
-
:winning_percentage,
|
|
85
|
-
:total_batters_faced,
|
|
86
|
-
:innings_pitched,
|
|
87
|
-
:innings_pitched_2,
|
|
88
|
-
:hits,
|
|
89
|
-
:home_runs,
|
|
90
|
-
:bases_on_balls,
|
|
91
|
-
:intentional_bases_on_balls,
|
|
92
|
-
:hit_batsmen,
|
|
93
|
-
:strikeouts,
|
|
94
|
-
:wild_pitches,
|
|
95
|
-
:balks,
|
|
96
|
-
:runs,
|
|
97
|
-
:earned_runs,
|
|
98
|
-
:earned_run_average
|
|
99
|
-
]
|
|
100
|
-
keys.delete_if { |key| %i(hold hold_points).include?(key) } if farm?
|
|
101
|
-
keys
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def farm?
|
|
105
|
-
%w(EL WL).include?(@league)
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
require 'open-uri'
|
|
2
|
-
require 'nokogiri'
|
|
3
|
-
|
|
4
|
-
module NpbApi
|
|
5
|
-
class TableExtraction
|
|
6
|
-
def initialize(url: '')
|
|
7
|
-
@url = url
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def tables
|
|
11
|
-
tables = Nokogiri::HTML(open(@url)).css('table')
|
|
12
|
-
tables.inject([]) { |arr, table| arr << table_arr(table) }
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
private
|
|
16
|
-
|
|
17
|
-
def table_arr(table)
|
|
18
|
-
table.css('tr').inject([]) { |arr, row| arr << row_arr(row) }
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def row_arr(row)
|
|
22
|
-
row.css('th', 'td').inject([]) { |arr, column| arr << column.content }
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|