서울시에 속한 모든 음식점 정보 데이터를 수집해야 할 일이 생겼다
다 모을 수는 없지만 최대한 많이 긁어 모으기 위해서 서울시 >> 25개 구 >> 그 구에 속한 동별로 검색해서 모으기로 했는데 그러기 위해서는 각 구에 속한 동 정보들이 필요했다. 물론 수기로 입력하면 금방 모으겠지만... 한 구당 최소 10개 최대 15개 정도의 동이 존재하는데 이 정도면 백준 실버급 코딩 아닐까해서 그냥 코드 짜서 자동화로 돌려보기로 했다
지리나 지도 정보 관련해서 주는 데이터들 같은데 브이월드는 영문명도 주지만 구까지만 줬고 SGIS의 경우는 서울시 -> 서울시에 속한 구 -> 구에 속한 동을 구하는 방식으로 데이터들을 구할 수 있었지만 영문명은 주지 않았다
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)