[01] 경마지에 숨겨진 0.1초를 찾아서

wangki·2026년 1월 31일

개요

pdf를 원하는 데이터로 파싱해보자
순수 클로드 코드만 활용했고 스킬이나, 추가적인 세팅을 하지않았다.

내용

간략하게 시퀀스 다이어그램으로 표현해보았다. 경마지 pdf를 파싱하고 파싱된 데이터를 db에 저장하는 간단한 구조이다. pdf를 보면 pdf 라이브러리를 사용한다고 해도 한숨부터 나온다.

pdf 파싱에 대해 하나도 알지 못하는 상태에서 해당 pdf를 /assets 하위에 넣어준 뒤, 파싱을 해달라고 했더니 토큰을 전부 소모하고도 쓰레기값만 나왔다. "아니, 바이브 코딩 최고라며 쓰레기같은데?" 라는 생각이 들었다. 살짝 서칭을 해보니, 가이드라인 문서같은 걸 작성하여 알려주면 더 잘한다고 해서 만들어 보았다. pdf_processing.md 파일을 작성하였다.

# 원하는 데이터 
- 각 마번을 부여 받은 말들의 데이터 
    - 기수 
    - 부담 중량 

- 실제 경주
- 주행 심사 

251127-3R 주행심사 1000 비8% 
251127: 경기 날짜
-3R: 3경주
주행심사: 경기 종류 
1000: 경기 거리 


251220서1R국6 1200별A흐16%(0)
251220: 경기 날짜
서: 서울 경기 
1R: 1경주 
국6: 국산마 6등급 경주 
1200: 경주 거리 
별A: 부담중량 매기는 방식 

② 9스터닝돌 1:15.9 54.0 이스(1)
②: 등수, 2등 했다는 의미
9스터닝돌: 9번 마번을 부여받은 스터닝돌 (게이터 번호가 9번이었다는 의미)
1:15.9: 경주 기록 
54.0: 해당 경기 부담 중량 
(1): 해당 경주 인기도 순위 

2-- 2 2 2(12) 13.7-39.4-13.8/ 24.7-42.7
2-- 2 2 2(12): 시작 지점에서 200m 구간 2등, 3코너 진입 시 2등, 4코너 진입시 2등, 피니시라인으로부터 200m 지점에서 2등, (12) 총 12명이 뛰었다는 의미 

이런식으로 필요한 데이터 예시를 작성하였더니 생각보다 비슷하게 뽑아내는 것 같았지만, 상당히 흠이 많았다. 예를 들면, 등수가 없다거나, 게이트 번호가 다르다거나, 기수가 없다거나 등등 절대로 사용할 수 없는 쓰레기 값들이 쏟아져 나왔다. 클로드 코드가 만능은 아니고 결국 활용하는 파일럿의 역량이 중요하겠다는 생각이 들었다.

좌표로 분석

pdf를 좌표로 분석하는게 가능하다는 것을 알았다. 마사회에서 제공해주는 매 경주에 대한 정보가 pdf마다 모두 동일한 포맷으로 제공이 되기에 좌표로 분석하는 것이 정확하겠다는 생각을 했다. 클로드 코드에게 추가로 아래 정보를 제공했다.

# pdf 좌표 분석 
1. 첫 번째 박스 라인 

2. 두 번째 박스라인 부터는 말 정보, 기수 정보, 그리고 뒤 이어서 4개의 경주 정보가 들어있음. 

예시를 들어 줄게 
assets/s_run_hr_260131_01.pdf 이야 


첫 번째 칸
1베 스 트 밍 크
3암(230310)밤색 한국
프리덤차일드 - 앤즈밍크
김태성(80승) / 이상영
0전(  -/  -/  -/  -/  -) 0천원
60(개별)60(개별)
건 -/ -/ - 양 -/ -/ - 다 -/ -/ - 포 -/ -/ - 불 -/ -/ 
최-없음
평-없음 전적없음
망사눈+


두 번재 칸 
54.5(  0.0)
이용호
115승(6.7%)/17승 0전(0/0/0)
(40조)송문길 507승(13.9%)
11회133분(관,용호)/구14습0             
수영 : 0회 0바퀴
출발조교:251224(용호,양호)
251226좌후지교돌상1회
251213마비성근색소뇨증2회
251005우후지 부종2회


세 번째 칸 
251226-3R 주행심사 1000 
① 8미라클한1:03.0 57.0 상범
② 6우아센1:03.2 55.0+1 아르
③ 7글로벌컴1:04.1 55.0 재철
④ 4파라디소1:04.2 54.0+1 효정
⑥ 3라스트케1:04.5 53.0 한별
⑨ 1베스트밍1:05.6 53.0+1 용호
6-- 6 8 9(9)  14.9-39.2-13.1/ 14.9-33.19
468

위 내용을 제공해 준 뒤, 다시 분석을 해달라고 요청했더니 처음과 다른 정확도의 데이터를 제공해 주었다. 특히 데이터를 뽑은 뒤, 스스로 데이터를 검증하는 작업이 매우 편리했다. python 코드를 한 줄도 보지 않고 만들었다는 게 다소 충격적이었다. 디테일한 세부사항을 프롬프트로 조정해 준 뒤 정확히 데이터를 파싱 할 수 있었다.

{
    "번호": 1,
    "말이름": "그랜드파크",
    "나이": "4세",
    "성별": "수",
    "생년월일": "2022-01-28",
    "부담중량": "52.5kg",
    "중량변화": "0.0kg",
    "기수": "김정준",
    "실제경주기록": [
      {
        "날짜": "2025-12-27",
        "경주번호": "3R",
        "경주장": "서",
        "등급": "국5",
        "거리": "1200m",
        "날씨": "",
        "해당말기록": {
          "등수": 7,
          "게이트번호": 4,
          "기록": "1:15.7",
          "부담중량": "52.5kg",
          "중량변화": "+0",
          "기수": "정준"
        },
        "구간기록": "10-- 11 10 10(11) 14.5-38.0-12.9/ 25.8-44.0",
        "추가정보": "508-2복4.9주로④ 104분 구16 습0 (94)"
      },
      {
        "날짜": "2025-11-23",
        "경주번호": "5R",
        "경주장": "서",
        "등급": "국5",
        "거리": "1800m",
        "날씨": "",
        "해당말기록": {
          "등수": 7,
          "게이트번호": 2,
          "기록": "2:00.0",
          "부담중량": "53.0kg",
          "중량변화": "0",
          "기수": "정준"
        },
        "구간기록": "10-- 8 8 3(11) 13.9-38.5-13.3/ 30.9-48.9",
        "추가정보": "510+8복34.6주로③ 129분 구13 습1 (88)"
      },
      {
        "날짜": "2025-10-18",
        "경주번호": "5R",
        "경주장": "서",
        "등급": "국5",
        "거리": "1400m",
        "날씨": "",
        "해당말기록": {
          "등수": 4,
          "게이트번호": 8,
          "기록": "1:28.7",
          "부담중량": "53.0kg",
          "중량변화": "+0",
          "기수": "기원"
        },
        "구간기록": "8-- 10 10 7(11) 14.2-38.2-13.2/ 38.0-56.8",
        "추가정보": "502+12복23.0주로④ 124분 구13 습1 (91)"
      },
      {
        "날짜": "2025-09-06",
        "경주번호": "2R",
        "경주장": "서",
        "등급": "국6",
        "거리": "1300m",
        "날씨": "",
        "해당말기록": {
          "등수": 2,
          "게이트번호": 4,
          "기록": "1:21.2",
          "부담중량": "57.0kg",
          "중량변화": "0",
          "기수": "정준"
        },
        "구간기록": "10-- 8 8 3(11) 13.9-38.5-13.3/ 30.9-48.9",
        "추가정보": "490+4복88.7주로③ 106분 구13 습0 (101)"
      }
    ]
  },

완벽하지는 않지만 만족스러운 결과이다.

결론

클로드 코드를 잘 사용하기 위해서는 어느 정도 개발을 알고 있으면 편리한 건 사실인 것 같다. 아예 개발 프로세스를 모르더라도 개발을 할 수 있지만, 방향성이 틀렸을 때, 코드를 분석하는 것으로 토큰 소모를 아낄 수 있는 것 같다(토큰이 무한이면 상관없을 것 같다.) 점점 흥미롭다.

0개의 댓글