음력날짜변환데이터

음력 날짜 변환하기

현재 공개된 “공식적인” 음력 변환 알고리듬은 존재하지 않는다. 한국 천문 연구원에서 계산한 결과가 우리가 사용하는 달력의 표준 음력이다. (개인적으로 만들어져서 배포되는 음력 변환 알고리듬이 좀 있기는 하나, 몇 년에 한 번 꼴로 오차가 있는 방식이라 크게 신뢰하기는 힘들다.) 한국 천문 연구원에서는 이 변환 알고리듬을 절대 공개하지 않고 있으며, 심지어 API로도 제공하지 않는다. ;;; 그런데 여기서 따로 변환기 페이지를 제공하고 있기는 하더라? 읭?

천문우주지식정보
http://astro.kasi.re.kr/Life/Knowledge/solar2lunar/convert_monthly.php

여기 소스를 까보면 POST로 요청이 들어오는 경우 년도와 월을 가지고 해당 년월의 양력 -> 음력 변환 결과를 테이블로 보여준다.

그래서 폼 소스를 까보니 sol_yearsol_month라는 필드를 넘겨주면 HTML 테이블이 날아오는 구조이더라는 것을 확인할 수 있었다. 그래서 아래와 같이 headless하게 테스트해보니 잘 되고 있다.

curl -X POST --data "sol_year=2015&sol_month=1" http://astro.kasi.re.kr/Life/Knowledge/solar2lunar/convert_monthly.php

그래서 좀 수고스럽지만 (응?) 이 REST API를 통해서 년,월을 넘겨주고 돌려받는 HTML을 파싱해서 그 결과를 DB에 때려 박아서 변환 데이터를 만들기로 결심했다. 이 때 받는 데이터의 인코딩이 cp949라 헐… 하는 마음이 가득…

파이썬

from urllib.request import Request, urlopen
from urllib.parse import urlencode
import copy

URL = "http://astro.kasi.re.kr/Life/Knowledge/solar2lunar/convert_monthly.php"

DATA = {"sol_year": None, "sol_month": None}

headers = {"Content-Type": "application/x-www-form-urlencoded",
"Accept":"text/html"}

data = copy.copy(DATA)
data["sol_year"] = 2015
data["sol_month"] = 1

req = Request(URL, method="POST",
data=urlencode(data).encode('utf-8'))
res = urlopen(req)
a = res.read().decode('cp949')
print(a)

이렇게하면 년, 월을 넘겨서 해당 소스를 받아 문자열로 변경하는 것 까지 완성된다.

날짜만 추출하기

내려받은 데이터를 파싱하려하는데, 필요한 부분만 발라내면 되는거라 간단하게 정규식으로 처리했다.

import re
pat = re.compile(r'.*?'
r'(d{4}-d{2}-d{2})'
r'.*?

.*?'
r'.*?'
r'(d{4}-d{2}-d{2})'
r'.*?

'
, re.DOTALL
)

m = pat.finditer(a)
for i in m:
print(i.group(1), i.group(2))