KBO 프로야구 팀 순위를 보여주는 파이썬 프로그램을 만들자.

  • 소스 데이터는 http://sports.news.naver.com/kbaseball/record/index.nhn?category=kbo&year=2017 링크에 있습니다.
  • 이곳에 있는 데이터를 urllib.request.urlopen, BeautifulSoup 등을 이용하여 처리합니다.
  • JSON 텍스트 형태의 데이터를 진짜 JSON으로 변환합니다.
  • 필요한 데이터를 가져옵니다.
  • 추가적으로 팀 이름에 한글이 포함된 경우 좀 더 보기 좋게 표현하도록 처리했습니다. (preformat_cjk 함수)

소스입니다.

import json
import unicodedata
import urllib.request
from bs4 import BeautifulSoup
 
def preformat_cjk (string, width, align='<', fill=' '):
        count = (width - sum(1 + (unicodedata.east_asian_width(c) in "WF") for c in string))
        return {
                '>': lambda s: fill * count + s,
                '<': lambda s: s + fill * count,
                '^': lambda s: fill * (count / 2)
                                + s
                                + fill * (count / 2 + count % 2)
}[align](string)
 
baseballData = urllib.request.urlopen('http://sports.news.naver.com/kbaseball/record/index.nhn?category=kbo&amp;year=2017')
source = baseballData.read()
baseballData.close()
 
soup = BeautifulSoup(source,'html.parser')
soup = soup.find_all('script')
 
for script in soup:
  line = str(script)
 
  if 'var ' in line and 'jsonTeamRecord' in line:
    recordList = line.split('jsonTeamRecord = ')
 
    for record in recordList:
      if record.startswith('{'):
        recordLine = record.splitlines()
        for finalLine in recordLine:
          if finalLine.endswith('}]};'):
            recordJsonData = finalLine
 
 
r = json.loads(recordJsonData[:-1])
regularTeamRecordList = r['regularTeamRecordList']
 
order=0
for team in regularTeamRecordList:
  t = json.loads(str(team).replace("'",'"'))
  order += 1
  tn = preformat_cjk(t['teamName'], 10)
  won = t['won']
  lost = t['lost']
  winDiff = t['winDiff']
  recentResult = t['recentResult']
  print('%02d  %s  %s  %s  %-5s   %s' % (order, tn, won, lost, winDiff, recentResult))

 

결과

01  KIA         67  37  0       5승-5패-0무
02  NC          62  44  6       4승-6패-0무
03  두산        60  43  6.5     8승-2패-0무
04  LG          54  49  12.5    4승-6패-0무
05  넥센        56  52  13      4승-6패-0무
06  SK          55  55  15      4승-6패-0무
07  롯데        53  53  15      6승-4패-0무
08  한화        43  61  24      5승-5패-0무
09  삼성        43  62  24.5    4승-6패-0무
10  kt          34  71  33.5    4승-6패-0무