포트폴리오

스타벅스 매장 지도에 표시하고 csv 파일로 저장하기

2020. 6. 19. 16:30

스타벅스 전국 매장 Crawling

  • 찾은 스타벅스 매장 지도에 표시

  • 데이터 csv 파일로 저장

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 folium
import collections
from collections import OrderedDict
import csv

Selenium을 사용하여 데이터 Crawling

  • 스타벅스 홈페이지의 매장찾기 - 지역 검색 - 전체 - 지점 크롤링

  • 마지막 세종시는 클릭하면 바로 검색되므로 예외처리

chrome_driver = 'D:/bigdata/Jupyter_python/chromedriver.exe'
driver = webdriver.Chrome(chrome_driver)
driver.implicitly_wait(5) # 응답의 시간 지연
# url = 'https://www.starbucks.co.kr/store/getStore.do?r=24F3U9PI7Q'
url = 'https://www.starbucks.co.kr/store/store_map.do'
# chrome driver로 해당 페이지가 물리적으로 open
driver.get(url)

# 값을 담을 리스트
starbucks = []

# 열린 페이지에서 '지역 검색' 탭 클릭
search = driver.find_element_by_link_text('지역 검색')
time.sleep(1)
search.click()

time.sleep(1)
# 개발자도구로 class : set_sido_cd_btn의 데이터 긁어옴
search = driver.find_elements_by_class_name('set_sido_cd_btn')

for item in search:
    item.click()
    time.sleep(1)

    # data-sidocd='01~17' 서울~세종
    if '17' == item.get_attribute('data-sidocd'):
        # 소스 가져오기
        src = driver.page_source

        # BeautifulSoup 객체로 변환
        soup = BeautifulSoup(src)
        name = soup.select('li[data-name]')
        for name_one in name:
            x = name_one['data-lat'] # 위도 저장
            y = name_one['data-long'] # 경도 저장
            z = name_one['data-name'] # 지점명 저장
            p = name_one.select_one('p').text.split('1522-3232')[0] # 번호는 모든 지점이 동일하여 crawling에서 제외
            starbucks.append({'name': z, 'address': p, 'lat': x, 'long':y}) # dict 형태로 리스트에 저장
        time.sleep(1)

        # 열린 페이지 닫기
        driver.close()
    else:
        search2 = driver.find_element_by_link_text('전체')
        search2.click()
        driver.implicitly_wait(5)
        time.sleep(1)

        src = driver.page_source

        soup = BeautifulSoup(src)
        name = soup.select('li[data-name]')
        for name_one in name:
            x = name_one['data-lat']
            y = name_one['data-long']
            z = name_one['data-name']
            p = name_one.select_one('p').text.split('1522-3232')[0]
            starbucks.append({'name': z, 'address': p, 'lat': x, 'long':y})
        time.sleep(1)

        # 다시 지역 검색 탭으로 돌아가기위한 소스
        search3 = driver.find_element_by_link_text('지역 검색')
        search3.click()
        time.sleep(1)
# 리스트 중복값 제거
starbucks = list(map(dict, collections.OrderedDict.fromkeys(tuple(sorted(d.items())) for d in starbucks)))

folium을 이용하여 지도에 표시

# 지도 작성
map_list = folium.Map(location=[35.95, 128.25], zoom_start=7)

for item in starbucks:
    latitude = float(item['lat']) # 위도
    longtitude = float(item['long']) # 경도
    # 지점 위치 표시
    folium.Marker(
        location = [latitude, longtitude],
        popup = 'jijum : {}, addr : {}'.format(item['name'], item['address']),
        # icon 적용 할 때 부트스트랩 최신버전을 사용하면 표시안됨. 3버전 이용
        icon=folium.Icon(color='green', icon='glyphicon glyphicon-star')
    ).add_to(map_list)
map_list
Make this Notebook Trusted to load map: File -> Trust Notebook

데이터 엑셀 파일로 저장

# newline=''을 넣으면 공백라인 제거
with open('starbucks.csv', 'w', newline='') as f:
    fieldnames =['지점명', '주소', '위도', '경도']
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    for i in starbucks:
        writer.writerow({'지점명': i['name'], '주소': i['address'], '위도': i['lat'], '경도': i['long']})

starbucks.csv
0.11MB
Starbucks.html
2.36MB