본문 바로가기

Data Science/Data Collection

[05. 공공데이터포털 API] 002. 상가(상권)정보

728x90

상가(상권)정보 API에 대해 알아보자. 상권에 대한 다양한 정보를 제공해준다. 업종의 분류부터 반경내 상권조회 등 광범위한 데이터를 조회할 수 있다. 우선 상권업종의 대분류, 중분류, 소분류에 대해 알아보자.

 

[그림 5.6] 상가(상권)정보 API

 

상권정보 업종 대분류 조회의 응답구조는 다음과 같다. 대분류를 통해서 중분류를 조회하고 중분류를 통해서 소분류를 조회하면 모든 분류를 다 조회할 수 있다. 요청 메시지에 대한 정보는 참고문서를 확인하기 바란다.

 

[그림 5.7] 상권정보 업종 대분류 조회 API 응답 구조

 

대분류 조회를 통해 알아낸 대분류 코드를 순환하며 모든 중분류 코드를 알아낸다. 그 다음에 중분류 코드를 이용하여 모든 소분류 코드를 구하는 파이썬 코드를 작성해보자.

 

import pandas as pd
import requests
from bs4 import BeautifulSoup
import time

def get_commercial_category_info(api_key):
    largeUpjong = pd.DataFrame()
    middleUpjong = pd.DataFrame()
    smallUpjong = pd.DataFrame()

    url = 'http://apis.data.go.kr/B553077/api/open/sdsc/largeUpjongList?serviceKey=%s' % api_key
    response = requests.get(url)
    result = response.text
    soup = BeautifulSoup(result, 'lxml')

    largeUpjong = []
    if soup.header.resultcode.text == '00':
        for item in soup.find_all('item'):
            largeUpjong.append({'indslclscd': item.indslclscd.text, 'indslclsnm': item.indslclsnm.text, 'stdrdt': item.stdrdt.text})
    if len(largeUpjong) > 0:
        largeUpjong = pd.DataFrame(largeUpjong)
        # 업종 대분류 코드 리스트를 바탕으로 중분류 조회
        middleUpjong = []
        for indslclscd in largeUpjong['indslclscd'].tolist():
            url = 'http://apis.data.go.kr/B553077/api/open/sdsc/middleUpjongList?serviceKey=%s&indsLclsCd=%s' % (api_key, indslclscd)
            response = requests.get(url)
            result = response.text
            soup = BeautifulSoup(result, 'lxml')
            if soup.header.resultcode.text == '00':
                for item in soup.find_all('item'):
                    middleUpjong.append({'indslclscd': item.indslclscd.text, 'indslclsnm': item.indslclsnm.text,
                                         'indsmclscd': item.indsmclscd.text, 'indsmclsnm': item.indsmclsnm.text,
                                         'stdrdt': item.stdrdt.text})
        if len(middleUpjong) > 0:
            middleUpjong = pd.DataFrame(middleUpjong)
            # 업종 대분류, 중분류 코드 리스트를 바탕으로 소분류 조회
            smallUpjong = []
            for i in range(len(middleUpjong[['indslclscd', 'indsmclscd']])):
                indslclscd = middleUpjong.loc[i, 'indslclscd']
                indsmclscd = middleUpjong.loc[i, 'indsmclscd']
                
                # 소분류 연속 조회하면 오류 발생 문제를 해결하기 위해 0.5초 딜레이 부여
                time.sleep(0.5)
                url = 'http://apis.data.go.kr/B553077/api/open/sdsc/smallUpjongList?serviceKey=%s&indsLclsCd=%s&indsMclsCd=%s' % (api_key, indslclscd, indsmclscd)
                response = requests.get(url)
                result = response.text
                soup = BeautifulSoup(result, 'lxml')
                if soup.header.resultcode.text == '00':
                    for item in soup.find_all('item'):
                        smallUpjong.append({'indslclscd': item.indslclscd.text, 'indslclsnm': item.indslclsnm.text,
                                            'indsmclscd': item.indsmclscd.text, 'indsmclsnm': item.indsmclsnm.text,
                                            'indssclscd': item.indssclscd.text, 'indssclsnm': item.indssclsnm.text,
                                            'stdrdt': item.stdrdt.text})
            if len(smallUpjong) > 0:
                smallUpjong = pd.DataFrame(smallUpjong)

    return smallUpjong

if __name__ == '__main__':
    api_key = '*'

    commercial_category_info = get_commercial_category_info(api_key)
    print(commercial_category_info)


결과 값
         indslclscd indslclsnm indsmclscd  ... indssclscd indssclsnm      stdrdt
0             A       1차산업        A09  ...     A09B00       갈탄광업  2015-12-17
1             A       1차산업        A09  ...     A09F01       골재채취  2015-12-17
2             A       1차산업        A09  ...     A09F03    공업용모래채취  2015-12-17
3             A       1차산업        A09  ...     A09K08      광업권임대  2015-12-17
4             A       1차산업        A09  ...     A09K02       규석광업  2015-12-17
...         ...        ...        ...  ...        ...        ...         ...
3342          R      학문/교육        R09  ...     R09A02      학원-모델  2015-12-17
3343          R      학문/교육        R09  ...     R09A04    학원-실내운전  2015-12-17
3344          R      학문/교육        R09  ...     R09A07    학원-심리변론  2015-12-17
3345          R      학문/교육        R09  ...     R09A05      학원-역학  2015-12-17
3346          R      학문/교육        R09  ...     R09A06      학원-침술  2015-12-17

 

다음으로 반경내 상가업소 조회 API에 대해 알아보자. 위도와 경도, 그리고 반경을 입력하면 그 반경내의 상가업소 정보를 제공해준다.

 

[그림 5.8] 반경내 상가업소 조회 API 요청 메시지

 

이를 조회하는 파이썬 코드를 작성해보자.

 

import pandas as pd
import requests
from bs4 import BeautifulSoup

def get_commercial_info_by_radius(api_key, cx, cy, radius):
    pageNo = 1
    commercial_info = []
    col = ''

    while True:
        url = 'http://apis.data.go.kr/B553077/api/open/sdsc/storeListInRadius?radius=%s&cx=%s&cy=%s&serviceKey=%s&pageNo=%s' % (radius, cx, cy, api_key, pageNo)
        response = requests.get(url)
        result = response.text
        soup = BeautifulSoup(result, 'lxml')
        col = soup.columns.text.split(',')

        if soup.resultcode.text == '00':
            for item in soup.find_all('item'):
                commercial_info.append(item.text.split('\n')[1:][:-1])
            pageNo += 1
        else:
            break

    if len(commercial_info) > 0:
        commercial_info = pd.DataFrame(commercial_info, columns=col)
    else:
        commercial_info = pd.DataFrame()

    return commercial_info

if __name__ == '__main__':
    api_key = '*'
    cx = '126.573301'
    cy = '33.449826'
    radius = '500'

    commercial_info_by_radius = get_commercial_info_by_radius(api_key, cx, cy, radius)
    print(commercial_info_by_radius)


결과 값
  상가업소번호                   상호명  ...                경도                위도
0   12049832            보듬이나눔이어린이집  ...  126.569842730846  33.4471790860129
1   12651699                   닷카페  ...  126.570917983364  33.4524387197337
2   13182203                  카카오2  ...  126.570917983364  33.4524387197337
3   11785666                모니카의밥집  ...  126.571748328434  33.4529621925838
4   11779884              커피니제주연평점  ...  126.571748328434  33.4529621925838
5   16169327                 파리바게뜨  ...  126.571727116988  33.4529439164895
6   16380513                 크린에이드  ...  126.571766357956  33.4518624645432
7   11911736               카페이안갤러리  ...  126.572609938913  33.4528909727292
8   14958220  제주국제자유도시개발센터사내근로복지기금  ...  126.572609938913  33.4528909727292
9   16160609       간단하지만특별한화피디Cafe  ...  126.572609938913  33.4528909727292
10  16323460              제이디씨파트너스  ...  126.572609938913  33.4528909727292
11  21510965                 씽크에이티  ...  126.572578388169  33.4535036884245
12  20266143             한라산성암영귤농원  ...  126.572578388169  33.4535036884245
13  22710380                    휴럼  ...  126.572578388169  33.4535036884245
14  23377808                홀푸드코리아  ...  126.572578388169  33.4535036884245
15  13181107          제주국제자유도시개발센터  ...  126.572578388169  33.4535036884245
16  16385003               제이제이모터스  ...  126.572573957015  33.4537741133953
17  16206823                    CU  ...  126.575650678682   33.453079214083
18  16030465                  대한후드  ...  126.576405192178  33.4503470542406
19  16275407                  멕시카나  ...  126.576527899457   33.451394304774
20  28456332          제주보듬이나눔이어린이집  ...  126.569842730846  33.4471790860129
21  24491162              휘닉스벤딩서비스  ...  126.570549095293  33.4506673573279
22  26220456            삼성웰스토리제주다음  ...  126.570549095293  33.4506673573279
23  26304378       에스프레사멘테일리제주사이언스  ...  126.570549095293  33.4506673573279
24  25461579                  GS25  ...  126.571748328434  33.4529621925838
25  23923821               제주가내츄럴팜  ...  126.572609938913  33.4528909727292
26  24629300                    CU  ...  126.572609938913  33.4528909727292
27  24308913                 첨단오피스  ...  126.572609938913  33.4528909727292
28  28122878                탐라레져개발  ...  126.572609938913  33.4528909727292
29  27152659                 써포트랜드  ...  126.572578388169  33.4535036884245
30  23397364               법인함박재농장  ...  126.572578388169  33.4535036884245
31  25986547                   위드오  ...  126.572578388169  33.4535036884245
32  24336597                경은정보기술  ...  126.572578388169  33.4535036884245
33  28371637        대한피부과학연구소제주연구소  ...  126.572578388169  33.4535036884245
34  24804446            제주전기자동차서비스  ...  126.572578388169  33.4535036884245
35  28318651              중앙감정평가법인  ...  126.572578388169  33.4535036884245
36  25731496                    CU  ...  126.572578388169  33.4535036884245
728x90