포트폴리오

카카오 API를 이용한 지도에 식당위치 표시하기

2020. 6. 10. 16:33

식신로드, 역대 서울지역 '만점 식당' 20선에 나온 식당위치 지도에 표시하기

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

from bs4 import BeautifulSoup
import time
import requests
import folium
chrome_driver = 'D:/bigdata/Jupyter_python/chromedriver.exe'
driver = webdriver.Chrome(chrome_driver)
driver.implicitly_wait(5) # 응답의 시간 지연
url = 'https://www.wikitree.co.kr/articles/217101'
# chrome driver로 해당 페이지가 물리적으로 open
driver.get(url)

# 소스 가져오기
src = driver.page_source

# 소스 BeautifulSoup 객체로 변환
soup = BeautifulSoup(src)

comment_area = soup.select('div#wikicon div')

# chrome driver 사용 후, close 함수로 종료
# driver.close()

식당이름 저장

name = []
strong = soup.select('div#wikicon strong')
# print(strong)
for item in strong:
    if len(item.text) > 1:
        item = item.text.split('회 ') # '회 ' 로 찾아야 애성회관 이름 안잘림
        #         print(item)
        if len(item) > 1:
            item = item[1]
            name.append(item)
print(len(name))
print(name)
20
['다성일식', '봉산집', '창고43', '돕감자탕', '대보명가', '해뜨는집', '아이 해브어 드림', '아현동 간장게장', '왕소금구이', '라틀리에 모니크', '비스트로 딩고', '줄리에뜨', '충주집', '영화루', '일품헌', '립스테이크', '오가와', '까사디노아', '충무로 주꾸미 불고기', '애성회관']

번호 및 주소 저장

p = soup.select('div#wikicon p')
address = []
tel = []
del(p[0])
del(p[0])
# print(p)
for i in p:
    if '서울시' in i.text or '서울' in i.text or '종로구' in i.text:
        address.append(i.text.replace('\xa0', ' '))
    if '02' in i.text:
        tel.append(i.text.replace('\xa0', ' '))
print(len(address))
print(address)
print(len(tel))
print(tel)
20
['서울시 서대문구 창천동 72-36', '서울시 용산구 용산동3가 1-21', '서울시 영등포구 여의도동 44-37 아일렉스타워15층(스카이점)', '서울시 광진구 화양동 9-22', '서울시 강북구 수유동 563-14', '서울시 성북구 동소문동 1가 62', '서울시 강남구 역삼동 821 이즈타워 B3', '서울시 마포구 아현동  282-1', '서울시 강남구 논현동 98-12', '서울시 강남구 청담동 80-21', '서울시 강남구 신사동 526-11', '서울시 서초구 반포4동 82-22', '서울시 동대문구 제기동 138-2', '서울시 종로구 누하동 25-1', '서울시 서초구 양재동 1-28', '서울시 종로구 부암동 208-37', '종로구 당주동 5 로얄빌딩 지하 1층', '서울 마포구 연남동 257-8 ', '서울 중구 필동 1가 3-20', '서울 중구 북창동 93-36']
20
['02-338-8951', '02-793-5022', '02-786-5959', '02-499-2838', '02-907-6998', '02-764-6354', '02-3453-7696', '02-312-7530', '02-545-6844', '02-549-9210', '02-518-7866', '02-535-4002', '02-923-1068', '02-738-1218', '02-574-7117', '02-379-2581', '02-735-1001', '02-3142-1108', '02-2279-0803', '02-352-0303 ']
result=[] # 식당이름, 전화번호, 주소 담을 리스트
for i in range(len(name)):
    result.append([name[i], tel[i], address[i]])
print(result)
[['다성일식', '02-338-8951', '서울시 서대문구 창천동 72-36'], ['봉산집', '02-793-5022', '서울시 용산구 용산동3가 1-21'], ['창고43', '02-786-5959', '서울시 영등포구 여의도동 44-37 아일렉스타워15층(스카이점)'], ['돕감자탕', '02-499-2838', '서울시 광진구 화양동 9-22'], ['대보명가', '02-907-6998', '서울시 강북구 수유동 563-14'], ['해뜨는집', '02-764-6354', '서울시 성북구 동소문동 1가 62'], ['아이 해브어 드림', '02-3453-7696', '서울시 강남구 역삼동 821 이즈타워 B3'], ['아현동 간장게장', '02-312-7530', '서울시 마포구 아현동  282-1'], ['왕소금구이', '02-545-6844', '서울시 강남구 논현동 98-12'], ['라틀리에 모니크', '02-549-9210', '서울시 강남구 청담동 80-21'], ['비스트로 딩고', '02-518-7866', '서울시 강남구 신사동 526-11'], ['줄리에뜨', '02-535-4002', '서울시 서초구 반포4동 82-22'], ['충주집', '02-923-1068', '서울시 동대문구 제기동 138-2'], ['영화루', '02-738-1218', '서울시 종로구 누하동 25-1'], ['일품헌', '02-574-7117', '서울시 서초구 양재동 1-28'], ['립스테이크', '02-379-2581', '서울시 종로구 부암동 208-37'], ['오가와', '02-735-1001', '종로구 당주동 5 로얄빌딩 지하 1층'], ['까사디노아', '02-3142-1108', '서울 마포구 연남동 257-8 '], ['충무로 주꾸미 불고기', '02-2279-0803', '서울 중구 필동 1가 3-20'], ['애성회관', '02-352-0303 ', '서울 중구 북창동 93-36']]

kakao API를 이용한 위도,경도 얻는 함수 작성

def getLatLng(address):
    app_key = 'KakaoAK ' + '__REST API Key__'
    url = 'https://dapi.kakao.com/v2/local/search/address.json' # endpoint
    params = {
        'query' : address,
        'page' : '',
        'AddressSize' : ''
    }
    headers = {'Authorization' : app_key}
    response = requests.get(url, headers=headers, params=params)
    status_code = response.status_code
    resp = response.json()
    
    if resp['documents'] != []:
        longitude = resp['documents'][0]['x'] # 경도
        latitude = resp['documents'][0]['y'] # 위도
        return longitude, latitude
    else:
        return (0, 0)

popup 내용과 위도,경도 분리

xylist = []
popuplist = []
for item in result:
    popuplist.append([item[0], item[1]])
    # 예외처리 : 16번째 주소만 인식을 못하여 '종로구 당주동 5'만 사용
    if '빌딩' in item[2]:
        nad = item[2].split('빌딩')[0]
        nad = nad.split(' 로얄')[0]
        xylist.append(nad)
        continue
    else:
        xylist.append(item[2])
print(xylist)
print(popuplist)
['서울시 서대문구 창천동 72-36', '서울시 용산구 용산동3가 1-21', '서울시 영등포구 여의도동 44-37 아일렉스타워15층(스카이점)', '서울시 광진구 화양동 9-22', '서울시 강북구 수유동 563-14', '서울시 성북구 동소문동 1가 62', '서울시 강남구 역삼동 821 이즈타워 B3', '서울시 마포구 아현동  282-1', '서울시 강남구 논현동 98-12', '서울시 강남구 청담동 80-21', '서울시 강남구 신사동 526-11', '서울시 서초구 반포4동 82-22', '서울시 동대문구 제기동 138-2', '서울시 종로구 누하동 25-1', '서울시 서초구 양재동 1-28', '서울시 종로구 부암동 208-37', '종로구 당주동 5', '서울 마포구 연남동 257-8 ', '서울 중구 필동 1가 3-20', '서울 중구 북창동 93-36']
[['다성일식', '02-338-8951'], ['봉산집', '02-793-5022'], ['창고43', '02-786-5959'], ['돕감자탕', '02-499-2838'], ['대보명가', '02-907-6998'], ['해뜨는집', '02-764-6354'], ['아이 해브어 드림', '02-3453-7696'], ['아현동 간장게장', '02-312-7530'], ['왕소금구이', '02-545-6844'], ['라틀리에 모니크', '02-549-9210'], ['비스트로 딩고', '02-518-7866'], ['줄리에뜨', '02-535-4002'], ['충주집', '02-923-1068'], ['영화루', '02-738-1218'], ['일품헌', '02-574-7117'], ['립스테이크', '02-379-2581'], ['오가와', '02-735-1001'], ['까사디노아', '02-3142-1108'], ['충무로 주꾸미 불고기', '02-2279-0803'], ['애성회관', '02-352-0303 ']]

함수 사용하여 위도, 경도 리스트에 저장하기

xpoint = []
ypoint = []
for i in xylist:
    x, y= getLatLng(i)
    xpoint.append(x) # 경도 저장
    ypoint.append(y) # 위도 저장
map_list = folium.Map(location=[37.566659527,126.978346859], zoom_start=10)

for item in range(len(result)):
    latitude = float(ypoint[item])
    longtitude = float(xpoint[item])
    folium.Marker(
        location = [latitude, longtitude],
        popup = popuplist[item],
        icon=folium.Icon(color='red', icon='glyphicon glyphicon-cutlery')
        # icon 적용 할 때 부트스트랩 최신버전을 사용하면 표시안됨. 3버전 이용
    ).add_to(map_list)
map_list
Make this Notebook Trusted to load map: File -> Trust Notebook
식신로드, 역대 서울지역 '만점 식당' 20선.html
0.32MB