본문 바로가기
Python/Crawling

[Crawling]_서울열린데이터광장에서 API로 데이터 수집하기

by ssolLEE 2023. 8. 15.
반응형

오늘은 '서울열린데이터광장'에서 데이터를 가져와 가공하는 연습을 하겠습니다. 

 

서울열린데이터광장?

  • 서울열린데이터광장은 서울시 시정활동 과정에서 수집된 다양한 데이터를 공유하는 곳입니다. 
  • 누구나 무료로 데이터를 이용하고, 재사용할 수 있습니다. 데이터에 대한 라이선스 정보도 함께 게시하고 있습니다. 
  • 데이터 수집 및 가공하는 실습을 진행하기 너무나도 좋은 우리나라입니다. ㅎㅎㅎ

데이터 수집 전 필수로 할 일! 인증키 발급

  • API로 데이터를 가져오기 위해서는 인증키가 꼭 있어야 합니다. 
  • 우선 우리가 실습할 데이터를 검색하겠습니다. 거기서 인증키를 발급받을 수 있어요!
  • '서울시 공동주택 아파트 정보'를 검색합니다.

  • 스크롤을 조금 내리다보면 Open API 항목이 보입니다. 클릭!

  • 오른쪽 위에 '인증키 신청'을 누릅니다. 
  • 약관 동의 후, 필요 내용을 입력하고 '인증키 신청'을 누르면 바로 인증키를 부여받을 수 있습니다.

샘플데이터 가져오기(확인하기)

  • 작업 파일에서 가상 환경에 접속한 후, jupyter lab을 실행시켰습니다.
  • 다음과 같이 샘플 url이 정상적으로 작동하는 지 확인합니다. (인증키)자리에는 자신의 인증키를 입력합니다. 
  • 저는 Json 형태로 데이터를 수집할 것이기 때문에 xml을 json으로 바꾸겠습니다.

import requests

url= "http://openapi.seoul.go.kr:8088/(인증키)/Json/OpenAptInfo/1/5/"
req = requests.get(url)
print(req)
>>>
<Response [200]>
  • [200]으로 응답하였으므로 우리는 데이터 수집을 잘 할 수 있습니다!!
  • json 타입의 데이터를 불러옵니다. 
json_df = req.json()
json_df

JSON 타입의 데이터를 데이터프레임으로 바꾸기

  • pandas를 import한 후 다음과 같이 데이터프레임 타입으로 데이터의 타입을 바꿉니다. 그래야 우리가 가공하기 쉽겠죠?
import pandas as pd

apt = json_df['OpenAptInfo']['row']
data_1 = pd.DataFrame(apt)
print(data_1)
  • 하지만 위의 url은 샘플url이어서 데이터가 5개밖에 되지 않습니다. 
  • 이제 명세서 다운로드 받아서 확인합니다. 명세서는 이 데이터에 대한 정보가 담겨있어서 데이터 가공할 때 꼭 참고해야 합니다. 
  • 그리고 데이터 요청은 한번에 최대 1000건을 넘길 수 없다고 합니다. 그렇다면 우리는 조건문을 사용하여 모든 데이터를 가져오도록 하겠습니다.
  • url의 마지막 주소는 1/1000, 1001/2000, 2001/3000 이런 식으로 반복되어야 합니다. 그러면 다음과 같이 샘플을 만들어볼 수 있습니다. 
import requests
import json
import pandas as pd

SERVICE_KEY = '(인증키)'

data = None
for j in range(1, 3):
    url = f'http://openapi.seoul.go.kr:8088/{SERVICE_KEY}/Json/OpenAptInfo/{1+(j-1)*1000}/{j*1000}/'
    print(url)
  • 두 개의 url이 출력되었다면 이제 확장시켜보겠습니다.  

진짜 데이터 가져오기!

  • 다음과 같이 확인됩니다.
import requests
import json
import pandas as pd

SERVICE_KEY = '(인증키)'

data = None
for j in range(1, 4):
    url = f'http://openapi.seoul.go.kr:8088/{SERVICE_KEY}/Json/OpenAptInfo/{1+(j-1)*1000}/{j*1000}/'
    # print(url)
    req = requests.get(url)
    content = req.json()
    con = content['OpenAptInfo']['row']
    result = pd.DataFrame(con)
    data = pd.concat([data, result])
data = data.reset_index(drop=True)
data.info()

데이터 가공하기

  • 이제 맘대로 데이터를 가공하면 됩니다! 저도 제 맘대로 해보겠습니다. 
  • 우선 혹시 모를 일을 대비하여 복사본으로 하겠습니다.
data_apt = data.copy()

특정 column 삭제하기 (df.drop(labels = , axis= )

  • 저는 삭제할 column을 drop_columns로 따로 표기하였습니다. 이렇게 하면 추가적으로 삭제할 열이 생기거나 할 때 유용합니다.(확장성!)
drop_columns = ['USE_RQSTDT', 'Y_CODE', 'X_CODE', 'EMPLYMINSRNC_MANAGE_NO', 'ATCH_FILE_ID', 'CN_APT', 'FXNUM', 'TELNO', 'APT_CODE', 'SN',
               'HMPG', 'API_INSERT_DATE', 'API_UPDATE_DATE', 'ADRES_CITY', 'KAPTADDR', 'ADRES_RMNDR', 'ADRES_DORO', 'ADRES_DORO_RMNDR', 'USE_TY',
               'HSHLD_ELCTY_CNTRCT_MTH', 'GNRL_MANAGECT_MANAGE_STLE', 'GUBUN', 'HSHLDR_TY', 'DOROJUSO']
data_apt_1 = data_apt.drop(labels = drop_columns, axis=1)
data_apt_1.head(2)

특정 column의 value값을 기준으로 데이터 재배열하기(df.sort_values(by=))

  • ADRES_GU 컬럼은 서울의 각 구를 나타냅니다. 이것을 기준으로 데이터를 정리할 수 있습니다.
data_apt_2 = data_apt_1.sort_values(by='ADRES_GU').reset_index()
data_apt_2

column이름 바꾸기

col_list = ['아파트명', '단지분류', '시군구', '읍면동', '복도유형', '난방방식', '전체동수', '전체세대수', '시공사', '시행사', 
            '사용검사일~사용승인일', '연면적', '주거전용면적', '관리비부과면적', '세대현황(60m^2이하)', '세대현황(85m^2이하)', '세대현황(135m^2이하)',
           '세대현황(135m^2초과)', '경비비관리형태', '청소비관리형태', '건축면적', '주차대수', '단지승인일', '관리비업로드']
data_apt_2.columns = col_list
data_apt_2

 

작업하면서 pandas와 더 친해져야함을 느끼네요. 다음 시간에도 함께 해요! 

감사합니다!