식신로드, 역대 서울지역 '만점 식당' 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