🖥️ IT, 컴퓨터/🐍 Python

[Python] 스타벅스 전국 매장주소 크롤링하기

김 홍시 2024. 10. 31. 22:10
반응형

스타벅스 공식 홈피에서는 매장 정보를 제공한다. 

 

https://www.starbucks.co.kr/store/store_map.do

 

스타벅스 커피 코리아

스타벅스 커피 코리아

www.starbucks.co.kr

 

플로우는 아래와 같다. 

먼저 시도를 고른다.

 

그다음 군/구를 고른다.  

 

그러나 세종은 step 2 없이 매장정보가 나온다. 

 

 

구조가 세종특별자치시만 다르기 때문에,

세종 제외 전국과 세종을 나눠서 코드를 돌렸다.  

세종 제외 전국 스타벅스 크롤링 코드

 

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import pandas as pd
import time
import warnings

#모든 경고 메시지 무시
warnings.filterwarnings(action='ignore')

#chrome 드라이버 등록 및 홈페이지 URL 지정
driver = webdriver.Chrome(executable_path='c:/yun/chromedriver.exe')
url = 'https://www.starbucks.co.kr/index.do'
driver.maximize_window()
driver.get(url)

action = ActionChains(driver)
#요소 지정
parent_level_menu = driver.find_element(By.CLASS_NAME, "gnb_nav03")

#요소에 마우스 갖다 대기
action.move_to_element(parent_level_menu).perform()
time.sleep(0.5)

# 특정 요소를 찾아서 클릭
xpath = '//*[@id="gnb"]/div/nav/div/ul/li[3]/div/div/div/ul[1]/li[3]/a'
child_level_menu = driver.find_element(By.XPATH, xpath)
child_level_menu.click()
time.sleep(0.5)


############이곳의 li[??]/a 가 지역 ###########
xpath = '//*[@id="container"]/div/form/fieldset/div/section/article[1]/article/article[2]/div[1]/div[2]/ul/li[??]/a'


seoul_btn = driver.find_element(By.XPATH, xpath)
seoul_btn.click()
time.sleep(0.5)

xpath = '//*[@id="mCSB_2_container"]/ul/li[1]/a'
all_btn = driver.find_element(By.XPATH, xpath)
all_btn.click()

time.sleep(2)
#현재 페이지의 HTML 전체 소스를 불러온다.
html = driver.page_source

#HTML, XML 구문 분석.
soup = BeautifulSoup(html, 'html.parser')
starbucks_store_list = soup.select('li.quickResultLstCon')

# 매장 정보 저장할 초기 변수 선언
starbucks_list = []

for store in starbucks_store_list :
    
    store_name = store.select('strong')[0].text.strip()
    store_lat = store['data-lat']
    store_long = store['data-long'] 
    store_type = store.select('i')[0]['class'][0][4:]
    Addr_And_CallNum = store.select('p.result_details')[0].decode_contents().split('<br/>')
    store_addr = Addr_And_CallNum[0]
    store_tel = Addr_And_CallNum[1]

    starbucks_list.append([store_name,store_lat,store_long,store_type,store_addr,store_tel])

## 엑셀 컬럼의 이름 지정
columns = ['매장이름','위도주소','경도주소','매장타입','매장주소','매장전화']
seoul_store_list_df = pd.DataFrame(starbucks_list, columns = columns)

#데이터를 엑셀파일로 저장
#파일 저장 시 인덱스 번호가 자동 삽입되므로 index=False를 사용해 인덱스를 삽입하지 않는다.
seoul_store_list_df.to_excel('스타벅스_매장리스트_17.xlsx', index=False)

#웹 사이트 닫기
driver.close()

 

############이곳의 li[??]/a 가 지역 ###########
xpath = '//*[@id="container"]/div/form/fieldset/div/section/article[1]/article/article[2]/div[1]/div[2]/ul/li[??]/a'

여기 ?? 에

1, 2, 3, ,... , 16을 입력해준다. 

 

 

세종시 스타벅스 크롤링 코드

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import pandas as pd
import time
import warnings

#모든 경고 메시지 무시
warnings.filterwarnings(action='ignore')

#chrome 드라이버 등록 및 홈페이지 URL 지정
driver = webdriver.Chrome(executable_path='c:/yun/chromedriver.exe')
url = 'https://www.starbucks.co.kr/index.do'
driver.maximize_window()
driver.get(url)

action = ActionChains(driver)
#요소 지정
parent_level_menu = driver.find_element(By.CLASS_NAME, "gnb_nav03")

#요소에 마우스 갖다 대기
action.move_to_element(parent_level_menu).perform()
time.sleep(0.5)

# 특정 요소를 찾아서 클릭
xpath = '//*[@id="gnb"]/div/nav/div/ul/li[3]/div/div/div/ul[1]/li[3]/a'
child_level_menu = driver.find_element(By.XPATH, xpath)
child_level_menu.click()
time.sleep(0.5)


############이곳의 li[??]/a 가 지역 ###########
xpath = '//*[@id="container"]/div/form/fieldset/div/section/article[1]/article/article[2]/div[1]/div[2]/ul/li[17]/a'


seoul_btn = driver.find_element(By.XPATH, xpath)
seoul_btn.click()
time.sleep(0.5)

'''
xpath = '//*[@id="mCSB_2_container"]/ul/li[1]/a'
all_btn = driver.find_element(By.XPATH, xpath)
all_btn.click()
'''

time.sleep(2)
#현재 페이지의 HTML 전체 소스를 불러온다.
html = driver.page_source

#HTML, XML 구문 분석.
soup = BeautifulSoup(html, 'html.parser')
starbucks_store_list = soup.select('li.quickResultLstCon')

# 매장 정보 저장할 초기 변수 선언
starbucks_list = []

for store in starbucks_store_list :
    
    store_name = store.select('strong')[0].text.strip()
    store_lat = store['data-lat']
    store_long = store['data-long'] 
    store_type = store.select('i')[0]['class'][0][4:]
    Addr_And_CallNum = store.select('p.result_details')[0].decode_contents().split('<br/>')
    store_addr = Addr_And_CallNum[0]
    store_tel = Addr_And_CallNum[1]

    starbucks_list.append([store_name,store_lat,store_long,store_type,store_addr,store_tel])

## 엑셀 컬럼의 이름 지정
columns = ['매장이름','위도주소','경도주소','매장타입','매장주소','매장전화']
seoul_store_list_df = pd.DataFrame(starbucks_list, columns = columns)

#데이터를 엑셀파일로 저장
#파일 저장 시 인덱스 번호가 자동 삽입되므로 index=False를 사용해 인덱스를 삽입하지 않는다.
seoul_store_list_df.to_excel('스타벅스_매장리스트_17.xlsx', index=False)

#웹 사이트 닫기
driver.close()

 

세종시는 step 2를 지워주고,

??에 17을 입력한다.

 

 

전국 스타벅스 현황 (2024년 버전)은 아래와 같다.

 

 

 

 

전국 스타벅스_2024.csv
0.18MB

반응형