본문 바로가기
[업무 지식]/Crawling

[서울시 열린데이터] 서울시 상권분석서비스(소득소비-상권)

by 에디터 윤슬 2025. 1. 3.

인증키 신청(생략) 및 URL 확인

라이브러리 호출

import requests
import pprint
import json
import pandas as pd
from dotenv import load_dotenv
import os

 

API 데이터 요청(JSON)

# .env 파일 로드
load_dotenv()

# 환경 변수에서 API 키 가져오기
SEOUL_API = os.getenv('SEOUL_API')

# API 요청 URL 설정
# URL 중 XML -> JSON으로 변경
base_url = "http://openapi.seoul.go.kr:8088"
endpoint = f"{base_url}/{SEOUL_API}/json/trdarNcmCnsmp/1/1000/20241"

try:
    response = requests.get(endpoint)
    if response.status_code == 200:
        data = response.json()
        df = pd.DataFrame(data['trdarNcmCnsmp']['row']) # json file 형식을 dataframe 으로 받아주기
        print(df)
    else:
        print(f"Error: {response.status_code}, {response.text}")
except Exception as e:
    print(f'An error occurred: {e}')

 

  • 환경 변수 로드
from dotenv import load_dotenv
import os

SEOUL_API = os.getenv('SEOUL_API') # API 키 가져오기

	•`dotenv` 라이브러리를 사용하여 `.env` 파일에 저장된 환경 변수를 로드합니다.
	•`.env` 파일에는 민감한 정보(예: API 키)를 저장하며, 코드에서 직접 키를 하드코딩하지 않도록 합니다.
    •`os.getenv()`를 사용하여 `.env` 파일에서 `SEOUL_API`라는 키 이름으로 저장된 값을 가져옵니다.
	•이 값은 서울시 열린데이터광장의 인증키(API Key)입니다.

 

  • API 요청 URL 설정
base_url = "http://openapi.seoul.go.kr:8088"
endpoint = f"{base_url}/{SEOUL_API}/json/trdarNcmCnsmp/1/5/"

	•`base_url`은 서울시 열린데이터광장의 기본 URL입니다.
		•`endpoint`는 API 호출을 위한 완전한 URL로, 인증키와 요청 형식(`json`) 및 데이터 범위(`/1/1000/`)를 포함합니다.
		•`/1/1000/`는 첫 번째부터 1000 번째(최대) 데이터까지를 요청한다는 의미입니다.

 

  • API 요청 보내기
response = requests.get(endpoint)

	•`requests.get()` 메서드를 사용하여 API에 HTTP GET 요청을 보냅니다.
	•`endpoint`는 호출할 API의 URL입니다.

 

  • 응답 처리
try:
    response = requests.get(endpoint)
    if response.status_code == 200:
        data = response.json()
        df = pd.DataFrame(data['trdarNcmCnsmp']['row']) # json file 형식을 dataframe 으로 받아주기
        print(df)
    else:
        print(f"Error: {response.status_code}, {response.text}")
except Exception as e:
    print(f'An error occurred: {e}')

	•응답 상태 코드가 `200`(성공)일 경우:
		•`response.json()`을 사용하여 JSON 형식의 응답 데이터를 Python 딕셔너리로 변환합니다.
		•`data'trdarNcmCnsmp''row'`: JSON 응답에서 필요한 데이터가 포함된 부분을 추출합니다.
		•`pd.DataFrame()`: 추출한 데이터를 Pandas DataFrame으로 변환하여 출력합니다.
	•상태 코드가 `200`이 아닌 경우:
		•오류 메시지와 상태 코드를 출력합니다.
        
	•	네트워크 문제, 잘못된 URL, 또는 기타 예외 상황에서 발생하는 오류를 처리합니다.
	•	예외가 발생하면 오류 메시지를 출력합니다.

 

  • 데이터 확인

 

  • json file 의 key 값 확인 (각 딕셔너리 값으로 이뤄져있음)
data['trdarNcmCnsmp'].keys()

>>> dict_keys(['list_total_count', 'RESULT', 'row'])
 
  • json 파일의 row 데이터 로드
data['trdarNcmCnsmp']['row']

[{'STDR_YYQU_CD': '20231',
  'TRDAR_SE_CD': 'A',
  'TRDAR_SE_CD_NM': '골목상권',
  'TRDAR_CD': '3110005',
  'TRDAR_CD_NM': '세검정',
  'MT_AVRG_INCOME_AMT': 3768541.0,
  'INCOME_SCTN_CD': '08',
  'EXPNDTR_TOTAMT': 884701599.0,
  'FDSTFFS_EXPNDTR_TOTAMT': 221446948.0,
  'CLTHS_FTWR_EXPNDTR_TOTAMT': 109882417.0,
  'LVSPL_EXPNDTR_TOTAMT': 64738346.0,
  'MCP_EXPNDTR_TOTAMT': 111988892.0,
  'TRNSPORT_EXPNDTR_TOTAMT': 149822911.0,
  'LSR_EXPNDTR_TOTAMT': 37478670.0,
  'CLTUR_EXPNDTR_TOTAMT': 25606895.0,
  'EDC_EXPNDTR_TOTAMT': 126544371.0,
  'PLESR_EXPNDTR_TOTAMT': 37192149.0},
 {'STDR_YYQU_CD': '20231',
  'TRDAR_SE_CD': 'A',
  'TRDAR_SE_CD_NM': '골목상권',
  'TRDAR_CD': '3110006',
  'TRDAR_CD_NM': '부암동주민센터',
  'MT_AVRG_INCOME_AMT': 3963935.0,
  'INCOME_SCTN_CD': '08',
  'EXPNDTR_TOTAMT': 267177363.0,
...