refactoring

This commit is contained in:
2026-05-02 16:24:42 +09:00
parent 296adf3073
commit 859c39fe0c
194 changed files with 5267 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
# ─────────────────────────────────────────────────
# crawler_constants.yaml
# 네이버 API 크롤러 상수
# ─────────────────────────────────────────────────
# HTTP 요청 헤더
headers:
User-Agent: "Mozilla/5.0"
Accept: "application/json, text/plain, */*"
Accept-Language: "ko-KR,ko;q=0.9"
Origin: "https://m.sports.naver.com"
x-sports-backend: "kotlin"
# 무시할 textOption type 코드
skip_option_types: [0, 8, 98, 99]
# 무시할 이벤트 텍스트
hidden_event_texts:
- "투수 투수판 이탈"
- "코칭스태프 마운드 방문"
- "포수 마운드 방문"
# 교체 키워드 (텍스트에 이것이 포함되면 교체 이벤트로 판단)
change_keywords:
- "(으)로 교체"
- "수비위치 변경"
# 최대 이닝 수
max_inning: 20

View File

@@ -0,0 +1,39 @@
# ─────────────────────────────────────────────────
# field_coordinates.yaml
# 타구 좌표, 타구종류, 파울 좌표
# ─────────────────────────────────────────────────
# 타구 좌표 (zone → x, y 퍼센트)
field_coordinates:
투수: [50, 80]
포수: [50, 93]
1루수: [63, 77]
2루수: [60, 65]
3루수: [37, 77]
유격수: [40, 65]
좌익수: [22, 42]
중견수: [50, 24]
우익수: [78, 42]
좌전: [30, 50]
중전: [50, 35]
우전: [70, 50]
좌중간: [34, 34]
우중간: [66, 34]
좌월: [20, 30]
중월: [50, 14]
우월: [80, 30]
# 타구 종류 매핑 (라벨 → value)
hit_ball_type:
땅볼: "0"
일반바운드: "1"
플라이: "2"
라인드라이브: "3"
펜스타구: "4"
홈런성타구: "5"
번트타구: "6"
# 파울 플라이 기준 좌표
foul_fly:
left: [2, 70]
right: [98, 70]

83
config/mappings.yaml Normal file
View File

@@ -0,0 +1,83 @@
# ─────────────────────────────────────────────────
# mappings.yaml
# 관리자 사이트 허용값(key) → 매핑되는 네이버/입력 표기(aliases)
#
# 구조: site_label: [alias_1, alias_2, ...]
# 매핑 방향: alias → site_label (역매핑으로 조회)
# ─────────────────────────────────────────────────
# 팀명 (관리자 사이트에서 사용하는 팀 표기)
team_name:
Hero: [키움, 키움 히어로즈, Hero]
# 나머지 팀은 네이버 표기와 사이트 표기가 동일하여 별도 매핑 불필요
# 팀 코드 → 한글 팀명 (네이버 API gameId 파싱용)
team_code:
한화: [HH]
KIA: [HT]
KT: [KT]
LG: [LG]
롯데: [LT]
NC: [NC]
두산: [OB]
SSG: [SK]
삼성: [SS]
키움: [WO]
# 구장명 (관리자 사이트 select 옵션 라벨)
stadium_name:
고척돔: [고척, 고척스카이돔]
잠실: [잠실, 잠실야구장]
대구라팍: [대구 삼성 라이온즈 파크, 대구라이온즈파크, 대구 라팍, 대구삼성라이온즈파크]
수원: [수원 케이티 위즈 파크, 수원KT위즈파크, 수원kt위즈파크]
창원: [창원NC파크, 창원 nc 파크, 창원 NC 파크]
대전: [대전 한화생명 볼파크, 대전한화생명볼파크]
"한밭(~2024)": [대전 한화생명 이글스파크, 대전한화생명이글스파크]
문학: [인천, 인천 SSG 랜더스필드, 인천SSG랜더스필드, 문학]
광주: [광주-기아 챔피언스 필드, 광주 기아 챔피언스 필드, 광주KIA챔피언스필드, 광주 kia 챔피언스 필드]
사직: [사직야구장, 사직]
울산: [울산문수야구장, 울산 문수야구장, 울산]
포항: [포항야구장, 포항]
마산: [마산야구장, 마산]
군산: [군산월명야구장, 군산]
청주: [청주야구장, 청주]
목동: [목동야구장, 목동]
무등: [무등야구장, 무등]
대구: [대구시민야구장, 대구]
# 경기 유형 (관리자 사이트 select 옵션)
game_type:
정규경기: [kbo_r]
와일드카드: [wildcard, wc]
와일드카드 결정전: [와일드카드]
준플레이오프: [semi_playoff, semi_po]
플레이오프: [playoff, po]
한국시리즈: [korean_series, ks]
# 포지션 번호 (관리자 사이트 defense_no)
position_number:
"1": [투수]
"2": [포수]
"3": [1루수]
"4": [2루수]
"5": [3루수]
"6": [유격수]
"7": [좌익수]
"8": [중견수]
"9": [우익수]
"10": [지명타자]
# KBO 시즌 ID 후보 (경기 타입별)
kbo_sr_id_candidates:
정규경기: ["0", "1", "2", "3", "4", "5", "7", "8", "9"]
와일드카드: ["3", "0", "1", "2", "4", "5", "7", "8", "9"]
준플레이오프: ["4", "0", "1", "2", "3", "5", "7", "8", "9"]
플레이오프: ["5", "0", "1", "2", "3", "4", "7", "8", "9"]
한국시리즈: ["7", "0", "1", "2", "3", "4", "5", "8", "9"]
# 투수 결과 라벨
result_labels:
승리투수: [W]
패전투수: [L]
홀드: [H]
세이브: [S]

76
config/pitch_rules.yaml Normal file
View File

@@ -0,0 +1,76 @@
# ─────────────────────────────────────────────────
# pitch_rules.yaml
# 관리자 사이트 허용값(key) → 매핑되는 네이버 표기(aliases)
#
# 구조: site_label: [naver_alias_1, naver_alias_2, ...]
# 매핑 방향: 네이버 alias → site_label (역매핑으로 조회)
# ─────────────────────────────────────────────────
# 구종 (관리자 사이트 evt_ballType 옵션)
pitch_type:
패스트볼: [직구, 패스트볼]
커브: [커브]
체인지업: [체인지업]
슬라이더: [슬라이더]
커터: [커터]
스플리터: [스플리터]
너클: [너클]
폭투: [폭투]
투심: [투심]
싱커: [싱커]
포크볼: [포크, 포크볼]
기타: [] # 매핑되지 않는 구종의 폴백
# 투구 결과 (관리자 사이트 evt_batter 투구결과 영역)
pitch_result:
: [볼]
"스트라이크(루킹)": [스트라이크]
"헛스윙(스트라이크)": [헛스윙]
번트시도-스트라이크: [헛스윙 번트, 번트 헛스윙, 번트헛스윙]
파울: [파울]
번트-파울: [번트파울]
몸에 맞는 볼: [몸에 맞는 볼, 몸에 맞는 공, 사구]
고의사구: [고의사구, 자동 고의사구]
폭투-볼: [폭투-볼]
포일-볼: [포일-볼]
보크: [보크]
보크-볼: [보크-볼]
노카운트: [노카운트]
# 타자 결과 (관리자 사이트 evt_batter 타자결과 영역)
batter_result:
# ── 세이프 ──
1루타: [single]
2루타: [double]
3루타: [triple]
홈런: [home_run]
포볼: [walk]
고의사구: [intentional_walk]
몸에 맞는 볼: [hit_by_pitch]
번트안타: [bunt_hit]
수비실책: [reach_on_error]
야수선택: [reach_on_fielder_choice]
"땅볼출루(무안타)": [reach_on_grounder]
"1루타 후 주루아웃": [single_runner_out]
"2루타 후 주루아웃": [double_runner_out]
"3루타 후 주루아웃": [triple_runner_out]
"1루타 후 수비실책진루": [single_error_advance]
"2루타 후 수비실책진루": [double_error_advance]
"3루타 후 수비실책진루": [triple_error_advance]
# ── 아웃 ──
"루킹스트라이크-아웃": [strikeout]
번트-삼진: [bunt_strikeout]
아웃: [out]
희생 플라이: [sacrifice_fly]
희생 번트: [sacrifice_bunt]
# 주루 이벤트 (관리자 사이트 evt_runner_N)
runner_event:
일반 진루: [advance, score]
도루성공: [steal]
도루시도 아웃: [steal_fail]
포스아웃: [force_out]
견제 아웃: [pickoff_out]
수비 실책: [error_advance]
폭투-진루성공: [wild_pitch_advance]
포일-진루성공: [passed_ball_advance]

32
config/review_rules.yaml Normal file
View File

@@ -0,0 +1,32 @@
# ─────────────────────────────────────────────────
# review_rules.yaml
# 합의판정 항목 → 결과 그룹 매핑
# ─────────────────────────────────────────────────
# 합의판정 항목별 결과 그룹 (game_report.py + record_game_playwright.py 통합)
# type1 = 페어/파울, type2 = 아웃/세이프, type3 = 인정/불인정
review_result_groups:
홈런타구 페어 파울:
type: type1
options: [페어, 파울]
외야타구 페어 파울:
type: type1
options: [페어, 파울]
포수/태그플레이 아웃/세이프:
type: type2
options: [아웃, 세이프]
야수의 포구:
type: type2
options: [아웃, 세이프]
몸에 맞는 공:
type: type3
options: [인정, 불인정]
파울:
type: type3
options: [인정, 불인정]
헛스윙:
type: type3
options: [인정, 불인정]
기타:
type: type3
options: [인정, 불인정]

View File

@@ -0,0 +1,29 @@
# ─────────────────────────────────────────────────
# site_selectors.yaml
# 관리자 사이트 CSS 셀렉터 및 수비 버튼 매핑
# ─────────────────────────────────────────────────
# 수비 버튼 CSS 셀렉터 (포지션 → selector)
defense_button_id:
투수: "input[name='defenseNumberBtn']#picher"
포수: "input[name='defenseNumberBtn']#catcher"
1루수: "input[name='defenseNumberBtn']#runner_1"
2루수: "input[name='defenseNumberBtn']#runner_2"
3루수: "input[name='defenseNumberBtn']#runner_3"
유격수: "input[name='defenseNumberBtn']#shortStop"
중견수: "input[name='defenseNumberBtn']#centerFielder"
우익수: "input[name='defenseNumberBtn']#rightFielder"
좌익수: "input[name='defenseNumberBtn']#leftFielder"
# 포지션 → 수비번호 (사이트 defense_no select 옵션 value)
position_to_defense_no:
투수: "1"
포수: "2"
1루수: "3"
2루수: "4"
3루수: "5"
유격수: "6"
좌익수: "7"
중견수: "8"
우익수: "9"
지명타자: "10"