음력 날짜 변환하기
현재 공개된 “공식적인” 음력 변환 알고리듬은 존재하지 않는다. 한국 천문 연구원에서 계산한 결과가 우리가 사용하는 달력의 표준 음력이다. (개인적으로 만들어져서 배포되는 음력 변환 알고리듬이 좀 있기는 하나, 몇 년에 한 번 꼴로 오차가 있는 방식이라 크게 신뢰하기는 힘들다.) 한국 천문 연구원에서는 이 변환 알고리듬을 절대 공개하지 않고 있으며, 심지어 API로도 제공하지 않는다. ;;; 그런데 여기서 따로 변환기 페이지를 제공하고 있기는 하더라? 읭?
천문우주지식정보
http://astro.kasi.re.kr/Life/Knowledge/solar2lunar/convert_monthly.php
여기 소스를 까보면 POST로 요청이 들어오는 경우 년도와 월을 가지고 해당 년월의 양력 -> 음력 변환 결과를 테이블로 보여준다.
그래서 폼 소스를 까보니 sol_year
와 sol_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))