서울의 모든 동 정보 오픈 API 로 수집하기

lemythe423·2023년 5월 13일
0

개요

서울시에 속한 모든 음식점 정보 데이터를 수집해야 할 일이 생겼다
다 모을 수는 없지만 최대한 많이 긁어 모으기 위해서 서울시 >> 25개 구 >> 그 구에 속한 동별로 검색해서 모으기로 했는데 그러기 위해서는 각 구에 속한 동 정보들이 필요했다. 물론 수기로 입력하면 금방 모으겠지만... 한 구당 최소 10개 최대 15개 정도의 동이 존재하는데 이 정도면 백준 실버급 코딩 아닐까해서 그냥 코드 짜서 자동화로 돌려보기로 했다

준비

  1. 오픈 API
    일단 구를 입력하면 그 구에 속한 동들의 정보를 줄 수 있는 API를 찾아야 했다. 구글링하니까 쉽게 찾을 수 있었음

지리나 지도 정보 관련해서 주는 데이터들 같은데 브이월드는 영문명도 주지만 구까지만 줬고 SGIS의 경우는 서울시 -> 서울시에 속한 구 -> 구에 속한 동을 구하는 방식으로 데이터들을 구할 수 있었지만 영문명은 주지 않았다

  1. 각 동의 영문명
    오픈 API를 통해 얻을 수 없었기 때문에 수기로 입력하기로 하고 SGIS를 선택해 코드를 짰는데 막상 짜고나서 결과값을 보니까 총 66개였다. 66개의 데이터에 대해서 전부다 수동으로 입력하는 건 좀; 여기까지왔는데 그건 좀 효율 떨어지는 일 같았고 나는 모든 시스템을 다 자동으로 돌리고 싶었기 때문에 그냥 파이썬에서 번역 모듈을 찾아봤다. 엄청 고도의 번역 기술을 요하는 것도 아니었고 한글 -> 영문으로 발음 그대로 바꾸면 되는거였기 때문인지 의외로 결과를 잘 나왔다
  • googletrans
from googletrans import Translator

translator = Translator()
result = translator.translate('보문', dest='en')

print(result.text)

# Bomun

다만 이런식으로 하면 길 -> gli 이 아니라 road 로 번역되는 대참사 오류가 발생했기 때문에 주소를 영문명으로 변경해주는 API를 사용하는 걸로 바꿨다

영문 주소 변경
https://www.kraddress.com/open-api
https://business.juso.go.kr/addrlink/openApi/searchApi.do

두 가지 다 준비됐기 때문에 코드를 짜봤당!

결과 코드

from googletrans import Translator
import requests

# 오픈 API 주소
apiurl = "https://sgisapi.kostat.go.kr/OpenAPI3/addr/stage.json?"

# api key
params = { "accessToken":"" }

# 내가 수집할 시군구 이름
gu_list = ['서초구']

# 각 구의 코드(cd) 정보 수집 후 그 코드로 각 구에 속한 동 정보 수집
dong_info = []

# 동의 정보를 수집할 함수 
def collect_dong(gu, cd):
    params['cd'] = cd
    response = requests.get(apiurl, params=params)
    if response.status_code == 200:
        for rr in response.json()['result']:
            name = rr['addr_name']
            plus_num = ''
            for i in range(len(name)):
                if name[i].isdigit():
                    plus_num = name[i:-1]
                    break

            en_name = requests.get('https://www.juso.go.kr/addrlink/addrEngApi.do?keyword='+ name +'&resultType=json&confmKey=devU01TX0FVVEgyMDIzMDQyMzE2MTExMzExMzcxNDg=').json()['results']['juso'][0]['emdNm'].lower()
            # en_name = translator.translate(name[:-1], dest='en').text.replace(' ', '')
            # print(name, en_name)
            en_name = en_name.split('-')[0] + plus_num + '-dong'
            print(en_name)
            dong_info.append((gu+' '+name, en_name))

# 내가 찾을 구를 찾은 다음에 그 구의 코드를 통해서 collect_dong 함수 실행
# 4시간마다 API 키를 갱신해줘야 하기 때문에 호출했을 때 유효하지 않은 키 값이라면 Access Token을 다시 불러와 저장해야함
params['cd'] = '11'
try:
    response1 = requests.get(apiurl, params=params).json()['result']
except:
    ass_token = requests.get('https://sgisapi.kostat.go.kr/OpenAPI3/auth/authentication.json?consumer_key=&consumer_secret=7113c49dadc44bd0b391').json()['result']['accessToken']    
    print(ass_token)
    params['accessToken'] = ass_token
    response1 = requests.get(apiurl, params=params).json()['result']

for res in response1:
    if (gu:=res['addr_name']) in gu_list:
        cd = res['cd']
        collect_dong(gu, cd)

print(dong_info)
profile
아무말이나하기

0개의 댓글