통계청은 OpenAPI를 제공하고 있습니다. 자주 사용하는 KOSIS 사이트와는 달리, OpenAPI는 “KOSIS 공유서비스”라는 별도의 페이지에서 제공하고 있습니다.Json과 XML 형태로 데이터를 불러올 수 있으며, 회원가입 후 APIKey를 발급받아서 사용가능합니다.
간단하게 경기도 민원처리건수를 불러와보겠습니다.
KOSIS 공유서비스에 로그인 후 “서비스이용”의 “통계자료”에서 “신청현황” 탭을 가시면, 맨 아래 “통계표선택” 버튼이 있습니다.
“통계표선택”을 누르시면, 새로운 창이 뜨는데 이 곳에서 원하는 통계표를 선택하고, 통계표 주소를 생성할 수 있습니다.
경기도 민원처리건수는 (작성기관: 경기도, 통계표명: 민원서류처리)를 입력하시고 검색하시면 확인하실 수 있습니다.
경기도 민원서류처리를 선택하시면, (조회구분: 횡단면)을 선택하시고, 분류에서 원하는 분류를 체크해주시면 됩니다.
[ 데이터 포맷 : JSON, 조회기간 설정 : 기간설정 ]으로 선택하고, 주기는 “년”으로 선택하였습니다.
시점은 아무 시점을 선택하더라도 상관 없습니다.
원하는 옵션을 전부 선택한 후, URL보기를 눌러서 생성된 URL을 복사했습니다.
URL(예시) : http://kosis.kr/openapi/Param/statisticsParameterData.do?method=getList&apiKey=apiKey&itmId=T1+&objL1=ALL&objL2=ALL&objL3=&objL4=&objL5=&objL6=&objL7=&objL8=&format=json&jsonVD=Y&prdSe=Y&startPrdDe=2017&endPrdDe=2017&loadGubun=2&orgId=210&tblId=DT\\\\_21002\\\\_P011 (위의 URL은 제가 복사한 URL에서 APIKey를 제거한 주소이기 때문에, 작동하지 않습니다.)
URL의 각 부분이 의미하는 바가 있고, 각 부분의 값을 알면 홈페이지에 들어가지 않고도 원하는 통계표를 찾을 수 있지만, 여기서는 생략하겠습니다.
먼저 필요한 모듈을 불러옵니다.
import requestsimport pandas as pdfrom pandas.io.json import json_normalizefrom simplejson import JSONDecodeErrorimport time
Code language: JavaScript (javascript)
위의 복사한 URL과 원하는 시작과 끝 연도를 넣으면, 복사한 URL의 테이블에서 원하는 연도의 테이블을 모두 가져오도록 하는 kosis def를 작성합니다.
def kosis(s_year, e_year, url_one): one_year = url_one.split('startPrdDe=')[1][:4] year_want = list(range(s_year, e_year + 1)) result = pd.DataFrame() for year in year_want: try: url = url_one.split(str(one_year))[0] + str(year) + url_one.split(str(one_year))[1] + str(year) + url_one.split(str(one_year))[2] print(url) r = requests.get(url) data = r.json() df = pd.DataFrame.from_dict(json_normalize(data), orient='columns') result = result.append(df) time.sleep(1) except JSONDecodeError: print("{0}년 마지막 페이지에 도달했습니다.".format(year)) break return result
Code language: PHP (php)
def kosis는 s_year(시작연도)와 e_year(끝연도)를 넣고 url을 넣으면, url에서 연도만 바꾸면서 s_year부터 e_year까지의 데이터를 불러옵니다.
마지막으로, def kosis를 실행합니다.
da01 = kosis(2005, 2017, '<http://kosis.kr/openapi/Param/statisticsParameterData.do?method=getList&apiKey=apiKey&itmId=T1+&objL1=ALL&objL2=ALL&objL3=&objL4=&objL5=&objL6=&objL7=&objL8=&format=json&jsonVD=Y&prdSe=Y&startPrdDe=2017&endPrdDe=2017&loadGubun=2&orgId=210&tblId=DT_21002_P011>')
Code language: HTML, XML (xml)
전체코드
import requestsimport pandas as pdfrom pandas.io.json import json_normalizeimport sqlite3from simplejson import JSONDecodeErrorimport timedef kosis(s_year, e_year, url_one): one_year = url_one.split('startPrdDe=')[1][:4] year_want = list(range(s_year, e_year + 1)) result = pd.DataFrame() for year in year_want: try: url = url_one.split(str(one_year))[0] + str(year) + url_one.split(str(one_year))[1] + str(year) + url_one.split(str(one_year))[2] print(url) r = requests.get(url) data = r.json() df = pd.DataFrame.from_dict(json_normalize(data), orient='columns') result = result.append(df) time.sleep(1) except JSONDecodeError: print("{0}년 마지막 페이지에 도달했습니다.".format(year)) break return resultda01 = kosis(2005, 2017, '<http://kosis.kr/openapi/Param/statisticsParameterData.do?method=getList&apiKey=apiKey&itmId=T1+&objL1=ALL&objL2=ALL&objL3=&objL4=&objL5=&objL6=&objL7=&objL8=&format=json&jsonVD=Y&prdSe=Y&startPrdDe=2017&endPrdDe=2017&loadGubun=2&orgId=210&tblId=DT_21002_P011>')
Code language: HTML, XML (xml)
댓글 남기기