본문 바로가기
Analysis Tips

[공공데이터] 아파트 실거래 매매 API 연결

by dovah. 2021. 1. 3.
반응형

새해 기념이랄까, 아니면 이사를 가고 싶어서일까..

 

작년에 했었던 아파트 매매 관련 분석을 다시 해보고 싶어졌다.

 

dovah.tistory.com/11?category=884682

[Study] 아파트 호재 분석(2020-03-07)

부동산 호재가 아파트 매매가에 얼마나 영향을 끼칠까? 라는 궁금증에서 친구들과 시작하게 되었다. 우선 데이터 수집처부터 확인했다. 1. 공공데이터 수집 공공데이터를 통해서 아파트 매매 실

dovah.tistory.com

이전에는 공공데이터 포털과 네이버 뉴스 데이터를 모아서 분석하는 걸 해보려했었는데,

이번에는 매매 데이터를 DB에 넣고 

이를 간단히 시각화하고 지역별 비교같은 분석을 해보고 싶어졌다.

 

그래서 이전에 했던 API 연결 코드를 활용해서 했는데,,,,,

 

어쩐일인지... 에러가 자꾸 나타났다...

몇가지 이유가 있었는데, 

 

 

 

 

실제 특정기간의 데이터이다.

두번째 데이터에는 도로명, 일련번호가 존재했으나, 첫번째 데이터에는 해당 내용을 찾아볼 수가 없다.

 

이전의 만든 코드는 특정 변수에 대해 전체 값을 가져와서 데이터프레임에 새로운 변수로 넣는 형식이었다. 

 

for col in col_list:
	temp_list = [i.text for i in root.iter(col)]
	temp_data[col] = temp_list

 

그렇기 때문에 특정 항목에 대한 값이 없을 경우 데이터 수가 맞지 않아 에러가 발생한다.

 

해결해볼려고 참 많은 시도를 했었는데, elementtree를 통해서 parsing하는 경우에는 잘 되지 않았다.

상위 노드인 'item'을 활용하면 될 것 같았는데, 이상하게 잘 안되었다.

(아마 내가 못한 것이겠지..)

 

그래서 이번에는 beautifulsoup을 통해서 진행하는 걸로 변경했다.

또한, 한 변수씩 진행했던 것을 1개의  row로 수집하는 걸로 변경했다.

 

temp_url = 'http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTradeDev?'\
       	+'ServiceKey={service_key}&LAWD_CD={g}&DEAL_YMD={d}'

col_list = ['거래금액', '건축년도', '년', '도로명', '도로명건물본번호코드',
        	'도로명시군구코드', '도로명일련번호코드', '도로명코드',
        	'법정동', '법정동본번코드', '아파트', '월', '일', '전용면적', '지번', '지역코드', '층']
for geo in tqdm(geo_code):
    for period in period_list:
        url = temp_url.format(service_key=service_key, g=geo, d=period)
        r = requests.get(url)
        
        temp_data = pd.DataFrame(columns = col_list) 
        xml_parser = BeautifulSoup(r.text, 'xml')

        i = 0 #(1)
        for item in xml_parser.find_all('item'): #(2)
            temp_list = [] #(3)
            for col in col_list: #(4)
                try:
                    temp_list.append(item.find(col).text) #(5)
                except:
                    temp_list.append('None_Value')
            temp_data.loc[i] = temp_list #(6)
            i += 1 #(7)
            
        data_list.append(temp_data)

 

col_list의 경우 내가 임의로 선정한 변수들이다.

 

beautifulsoup을 통해서 xml 형태로 파싱한다.

(1) 데이터 프레임에 1개의 row로 쌓아야하기 때문에, 인덱스 i를 0으로 생성한다.

(2) 각 item별로 확인할 수 있도록 반복 구문으로 진행한다.

(3) 1개의 item을 확인할때 마다 새로운 list를 생성한다.

(4) 각 변수별로 반복구문을 진행하며,

(5) 앞서 선정한 변수별로 현재 item에서 값을 찾는다. 만약 값이 없을 경우 'None_Value' 값으로 반환한다.

 

(6) (1)에서 설정된 인덱스 값을 바탕으로 temp_data에 쌓는다.

(7) 인덱스 값에 1을 더한다.

 

사실 이게 맞는거다! 라고 할 순없다.

그치만 내 개인적으론 여러 지역과 긴 기간의 데이터를 활용해보고 싶었기 때문에 

발생할 수 있는 에러를 최대한 제어하고 싶었다.

현재는 일일트래픽이 1000개여서 하루에 1년치정도만 수집할 수 있는데, 아마 기간이 늘어나면 다른 에러들도 마주칠것 같다.

그때 또 고쳐야지 뭐...

 

추가로, 내가 참고 했던 것은 아니지만 많은 분들이 해당 API에 대해 깔끔하게 정리해서 같이 공유할까 한다.

 

1. wooiljeong.github.io/python/public_data_reader_01/

 

PublicDataReader - 부동산 데이터 수집하기

국토교통부 아파트매매 실거래 데이터 수집하기

wooiljeong.github.io

이 분은 실제 라이브러리화까지 진행하신 것 같다.

처음 API 연결할때 많이 참고했다. 

 

2. ai-creator.tistory.com/24

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

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

ai-creator.tistory.com

A-Z까지 깔끔하게 해주셨다.

다만 법정동 데이터를 txt로 받고 python에서 txt로 읽는 방법을 선택하셨는데, 개인적으로 그냥 텍스트 파일을 엑셀로 읽어서 저장하는게 훨씬 편한 것 같다.

 

반응형

댓글