통계청은 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 requests
import pandas as pd
from pandas.io.json import json_normalize
from simplejson import JSONDecodeError
import time

위의 복사한 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

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>')

전체코드

import requests
import pandas as pd
from pandas.io.json import json_normalize
import sqlite3
from simplejson import JSONDecodeError
import time
 
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
 
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>')