개발

[OpenAPI/Python] 국토교통부 OpenAPI를 사용한 아파트 매매 실거래가 수집

jeonlego 2024. 4. 18. 16:33

문제

아파트 매매 실거래가 데이터를 csv로 다운받으려고 하는데, 홈페이지에서는 검색조건으로 계약일자 범위가 최대 1개월밖에 지정이 안 됨.

국토교통부에서 제공하는 OpenAPI를 활용해 수집.

조건

- 매매일자: 2019년 01월 ~ 2024년 12월
- 지역범위: 전체
- 최소금액: 0원
- 최대금액: 59999원

 

Step1. 공공데이터포털 가입 및 아파트매매 실거래자료 OpenAPI 신청

링크 : https://www.data.go.kr/data/15058747/openapi.do

 

국토교통부_아파트매매 실거래자료

부동산 거래신고에 관한 법률에 따라 신고된 주택의 실거래 자료를 제공

www.data.go.kr

 

신청하면 자동승인됩니다.

 

Step2. API 문서 확인 및 테스트

마이페이지 > 데이터 활용 > Open API > 활용신청 현황 > '국토교통부_아파트매매 실거래자료' 클릭

 

한글 파일을 다운받으면 API 명세를 확인할 수 있습니다.

 

 

미리보기를 통해 API를 테스트해볼 수 있습니다. 

 

 

Step3. 법정동 코드 다운로드

링크: www.code.go.kr

 

법정동 코드 파일 포맷 utf-8로 변경

iconv -c -f euc-kr -t utf-8 [from_file_name] > [to_file_name]

 

Step4. 구현

원하는 데이터의 기간을 설정합니다.

 

#기간 설정
year = [str("%02d" %(y)) for y in range(2019, 2025)]
month = [str("%02d" %(m)) for m in range(1, 13)]
base_date_list = ["%s%s" %(y, m) for y in year for m in month ]

 

 

법정동 코드 파일을 읽어서 코드를 string 타입으로 저장합니다.

 

#법정동 코드 불러오기
code_file = "comtcadministcode_utf8.txt"
code_series = pd.read_csv(code_file, sep='\t')
code_series.columns = ['code', 'name', 'is_exist']
code_series = code_series[code_series['is_exist'] == '존재']
code_series = code_series.reset_index(drop=True)

#int64타입 string타입으로 변경
code_series['code'] = code_series['code'].apply(str)
code_list = code_series['code'].to_list()

 

법정동 코드로부터 지역코드를 저장합니다.

아파트 매매 신고정보 조회 기술문서.hwp

#'구'코드 : 법정동코드 10자리 중 앞 5자리
gu_code_list = []
for code in code_list:
    code = str(code[0:5])
    gu_code_list.append(code)

gu_code_list = list(dict.fromkeys(gu_code_list))

 

 

[함수]

지역코드, 계약월, 인증키를 파라미터로 넘겨주고 콜백 URL로 GET 메소드를 요청합니다.

 

def get_data(gu_code, base_date):
    url="http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade"
    service_key = "<인증키>"

    payload = dict()
    payload["LAWD_CD"] = gu_code
    payload["DEAL_YMD"] = base_date
    payload["serviceKey"] = service_key

    response = requests.get(url, params=payload)

    return response

 

 

[함수]

응답값을 파싱하여 조건에 맞는 데이터를 리스트로 반환합니다.

 

def get_items(response):
    root = ET.fromstring(response.content)
    item_list = []
    for child in root.find('body').find('items'):
        elements = child.findall('*')
        data = {}
        for element in elements:
            tag = element.tag.strip()
            text = element.text.strip()
            data[tag] = text
        if(int(data['거래금액'].replace(",","")) <= 59999):
            item_list.append(data)
            
    return item_list

 

 

위에서 정의한 함수를 호출하여 데이터를 리스트로 저장합니다.

에러가 날 경우 어느 날짜에 어느 지역코드에서 났는지 확인하고 다음 작업을 이어서 하기 위해 예외처리를 해줍니다.

 

items_list = []
for base_date in base_date_list:
    for gu_code in gu_code_list:
        try:
            #API 호출
            response = get_data(gu_code, base_date)
            items_list += get_items(response)
        except Exception as err:
            print(base_date, " ", gu_code, " error occurred")
    print(base_date, " done")

 

 

저장된 데이터를 csv 파일로 추출합니다.

 

#csv파일로 추출
items = pd.DataFrame(items_list)
items.head()
items.to_csv(os.path.join("apartment_sale_data_%s~%s.csv" %(year[0], year[-1])), index=False,encoding="utf-8")

 

 

※ SERVICE KEY IS NOT REGISTERED ERROR
인증키는 발급 후 약 1시간 후에 동기화되기 때문에 등록 에러가 날 수 있습니다.
1시간 후에도 동일한 에러가 난다면, 디코딩된 인증키를 입력하시면 됩니다.
그래도 안 된다면 인증키 재발급 받고 약 1시간 후에 다시 시도해보세요.
(데이터 활용 > Open API > 인증키 발급현황 > 일반 인증키 재발급)
공공데이터포털 FAQ

 

※ LIMITED NUMBER OF SERVICE REQUESTS EXCEEDS ERROR
개발계정에서 신청가능한 일일 트래픽은 1,000입니다.
운영계정으로 활용사례 등록하고 신청하면 일일 트래픽을 1,000,000까지 증가시킬 수 있습니다.
공공데이터포털 FAQ

 

전국에서 거래된 2019년부터 2024년까지의 데이터를 저장하는데 약 1시간 30분 소요되었습니다.

소스코드를 활용하여 원하는 기간, 구를 좁혀서 확인하실 수 있습니다.

 

전체 코드

https://github.com/jeonlego012/open_api_apartment_sale

 

GitHub - jeonlego012/open_api_apartment_sale

Contribute to jeonlego012/open_api_apartment_sale development by creating an account on GitHub.

github.com

 

참고

https://ai-creator.tistory.com/24

 

[Python] 아파트 매매 실거래가 수집하기 (feat. 국토교통부 OpenAPI)

> 부동산 매매데이터를 KB부동산 사이트 를 통해서 활용하는 경우가 많습니다. 그러나, 일일이 아파트를 검색하고, 매매거래가를 다운로드 받아서 활용해야 하는 불편함이 있습니다. '크롤링을

ai-creator.tistory.com