카카오 API로 맛집을 추천해보자

KDU·2022년 6월 15일
0

카카오 API 페이지

데이터 관련 공부를 하면서 자연스럽게 크롤링으로 다가가게 되었고, Python과 Kakao API와 folium을 사용해 지도에 마커를 표시하는 작업을 연습하게 되었다.

윈도우OS에서 Jupyter Notebook을 사용하였다.

코드

먼저, 필요한 모듈을 가져오자

import re
import requests
import folium
from bs4 import BeautifulSoup as BS

지도에 마커를 찍고, 검색API에 활용할 좌표를 구하는 함수

def getXY(addr):
    url = 'https://dapi.kakao.com/v2/local/search/address.json'
    params = {
        'query':addr,
        'analyze_type':'similar',
        'page':1,
        'size':10
    }
    headers = {
        'Authorization': 'KakaoAK 1a3b26c5c76d1de581fe1ff7864ca7e6'
    }
    
    res = requests.get(url, params=params, headers=headers)
    if res.status_code == 200:
        data = res.json()
        x = data['documents'][0]['x']
        y = data['documents'][0]['y']
    return (y,x)

카카오 지도로 검색을 수행해 맛집 검색 링크를 return하는 함수

def kakao_search(y, x, name):
    url = f'https://dapi.kakao.com/v2/local/search/keyword.json?y={y}&x={x}&radius=100'
    params = {'query':name}
    headers = {'Authorization': 'KakaoAK 1a3b26c5c76d1de581fe1ff7864ca7e6'}
    res = requests.get(url, params=params, headers=headers)
    if res.status_code == 200:
        data = res.json()
        if data['documents'] != []:
            return data['documents'][0]['place_url']
        else:
            return ''
    else:
        print('Error code:'+res.status_code)

맛집 데이터는 연습이기 때문에 2015년도 식신로드 데이터를 사용했다.
사용한 사이트 링크

url = 'https://www.wikitree.co.kr/articles/217101'
res = requests.get(url)
if res.status_code==200:
    data = res.text
soup = BS(data)

받은 데이터가 정상적으로 받아진 경우, HTML파일이기 때문에 soup 변수에 담긴 데이터를 정제해주어야 한다.

#div.article_body만 불러와 불필요한 부분을 제거
body = soup.select_one('div.article_body')
phone_addr = []
for i in range(len(body.select('p'))):
	#정규식으로 전화번호가 존재하는 라인을 찾았다면
    if re.match('\d{2,3}-\d{3,4}-\d{4}', body.select('p')[i].get_text()) != None:
    	#사이트 글의 패턴을 활용, i+1로 주소를 받는다
        phone = re.sub('\xa0',' ',body.select('p')[i].get_text())
        addr = re.sub('\xa0',' ',body.select('p')[i+1].get_text())
        phone_addr.append([phone, addr])

name = []
for i in body.select('strong'):
	#'회 '를 기준으로 음식점 이름이 나뉜다.
    if len(i.get_text().split('회 ')) > 1:
        name.append(i.get_text().split('회 ')[-1])

final_info = {}
#이름을 key, 전화번호와 주소를 value로 병합
if len(name) == len(phone_addr):
    for i in range(len(name)):
        final_info[name[i]] = phone_addr[i]

folium을 활용해 지도에 좌표를 찍어준다.

#folium.map 생성
address = '마커들의 중앙지점 주소 입력'
#지도가 어딜 보고있을지 정하는 loc
loc = getXY(address)
map = folium.Map(location=loc, zoom_start=11)

#반복문을 통해 각 맛집의 좌표를 맵에 찍어준다.
for k,v in final_info.items():

	#좌표받기
    loc = getXY(v[1])
    
    #자동 검색을 통해 검색이 가능한 맛집은 링크 생성
    kakao_Map = kakao_search(loc[0], loc[1], k)
    if kakao_Map.find('place.map.kakao.com') != -1:
        addr = f'<a href={kakao_Map} target="_blank">주소:{v[1]}</a>'
    else:
        addr = f'주소:{v[1]}'
        
    #팝업에 보일 텍스트
    popup_text = f'''점포명:{k}<br>
    전화번호:{v[0]}<br>
    {addr}<br>'''
    
    #팝업 크기 조절
    popup = folium.Popup(popup_text, min_width=100, max_width=300)
    
    #마커 생성
    folium.Marker(loc, tooltip=k, popup=popup, icon=folium.Icon(color='red', icon='info-sign')).add_to(map)
    
#맵 출력
map

map을 출력하면 나오는 맛집 이미지

검색가능 여부에 따라 링크가 생성된다.

API를 활용해 맛집 추천 좌표를 찍고, 주소를 클릭해 카카오 지도로 바로 이동할 수 있는 코드를 짜보았다. 더 다양한 API를 이해하고 적용할 수 있다면 편리하고 좋은 앱들을 만들 수 있을 것으로 기대한다.

profile
의문을 즐깁니다.

0개의 댓글