ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 카카오 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
Designed by Tistory.