파이썬 크롤링 연습 (1) - 스타벅스 매장 목록 불러오기

2020. 7. 18. 01:31캐리의 데이터 세상/파이썬

반응형

파이썬으로 내가 사는 지역의 스타벅스 매장 정보 불러오기를 해보겠습니다. 저도 하나씩 배우는 과정이라 설명이 미흡한 점은 의견주세요! 기초가 부족한 터라 실습하면서 전체 코드 읽으면서, 개발자 도구로 코드 확인하며 역으로 문법들을 익혀 나가는 중입니다. 

 

1. 크롤링 타겟 - 전국 스타벅스 매장 중 지역 - '서울'의 '강남구'에 위치한 스타벅스 매장 정보

 

먼저 스타벅스 홈페이지에서 '매장찾기' - 지역검색 페이지를 살펴봐주세요.

스타벅스 매장찾기 - 지역검색창 바로가기

 

웹드라이버를 통해 Chrome 브라우저를 직접 작동시켜  지역검색 -> '서울' 선택 -> '강남구' 선택 -> 매장정보 가져오기 까지 이르도록 해보겠습니다.

 

파이썬 크롤링으로 스타벅스 매장정보 찾기

 

화면이 이런 순서대로 흘러 가겠죠?

 

스타벅스 강남구 매장정보 크롤링

2. 코드 작성 

 

그럼 코드를 작성해 보겠습니다. 저는 VSCODE 에디터로 연습하고 있습니다.

 

(1) import, 드라이버 환경 

from bs4 import BeautifulSoup
from selenium import webdriver
import time

driver = webdriver.Chrome('./crawling/data/chromedriver')
driver.get('https://www.starbucks.co.kr/store/store_map.do?disp=locale')
time.sleep(20)

 크롤링을 실행하기 위해 selenium 라이브러리의 webdriver를 불러옵니다. 크롤링을 한 후에 가져온 html에서 정보를 추출하기 위해 BeautifulSoup 라이브러리도 추가했습니다.

*BeautifulSoup은 텍스트를 구조화 시켜서 접근할 수 있게끔 해줍니다

 

Beautiful Soup Documentation 바로가기

 

BeautifulSoup과 selenium을 미리 설치해 주시고 브라우저 제어를 위해 웹드라이버도 다운받아 현재 작업중인 같은 경로상에 넣어주세요. (저는 작업중 폴더 경로인 crawling에 data라는 폴더를 하나 생성해서 chromedriver를 넣어뒀습니다.

selenium과 BeautifulSoup은 콘솔에서 하기와 같이 설치 가능.

동적 구현이니 time을 넣어 로딩하는데 시간을 줍니다. 

pip install bs4
pip install selenium

 

※ ChromeDriver 설치방법

  • 우측 상단의 점3개 설정버튼 클릭 -> 도움말 -> Chrome 정보에서 버전을 확인해줍니다.
  • 크롬 드라이버 다운로드 바로가기
  • 현재 사용하는 크롬 버전정보와 드라이버 동일하게 맞춰서 다운로드 후 압축 풀고 작업 경로에 넣어줍니다.

(2) 브라우저 단계별 이동

 

driver.get(~)으로 매장찾기 페이지가 불러들어 졌으면 다음 단계인 지역검색으로 연결될 수 있도록 해보겠습니다.

 

먼저 Selenium 웹드라이버를 이용해 우리가 원하는 요소(element)를 찾을 수 있는데요 8가지 방법 셀레니움 개발자 문서를 통해서 좀 더 자세하게 참고해주세요.

 

Selenium 개발자 문서 바로가기

Locator Description
class name Locates elements whose class name contains the search value (compound class names are not permitted)
css selector Locates elements matching a CSS selector
id Locates elements whose ID attribute matches the search value
name Locates elements whose NAME attribute matches the search value
link text Locates anchor elements whose visible text matches the search value
partial link text Locates anchor elements whose visible text contains the search value.
If multiple elements are matching, only the first one will be selected.
tag name Locates elements whose tag name matches the search value
xpath Locates elements matching an XPath expression

 

개발자 도구 창은 설정->도구더보기 ->개발자 도구 혹은 ctrl+shift+i  로 확인 가능!

 

지역 검색 영역은 <header class="loca_search">~~</header> 요소 안에 앵커텍스트 문자열로 자리하고 있는데요, 셀레니움 웹 드라이버의 요소  위치 찾기 활용하겠습니다. class 이름이 "loca_search"인 것을 확인할 수 있는데요,

 

크롤링-스타벅스 매장정보 지역 검색창
스타벅스 매장 지역 검색 

 

class name을 이용해 지역검색으로 연결하겠습니다!

 

loca = driver.find_element_by_class_name('loca_search')
loca.click()
time.sleep(20)

에디터에 driver.find_ 까지만 검색해 보시면 뒤에 element_by가 있고 elements_by도 구분되어 있습니다. 찾는 element 수가 복수이면 s가 붙겠죠.

 

지역검색 페이지까지 이동되었다면 시/도 선택

 

시/도 명들이 <ul class="sido_area_box"> 하위에 <li>태그로 각각 묶여 있는데요, 전체 시/도명을 먼저 가져온 다음에 원하는 '서울'을 선택

 

 

지역검색 부분 개발자도구 태그 확인
셀리니움 - driver.find_elements_by

 

sido = driver.find_element_by_class_name('sido_arae_box')
li=sido.find_elements_by_tag_name('li') #elements는 해당하는 요소들을 모두 리스트로 반환
li[0].click() #서울은 리스트 첫번째에 위치하니 인덱스값 0으로 호출
time.sleep(20)

 

서울 지역으로 넘어 왔다면 이제 강남구를 선택해 보겠습니다.

 

 

셀리니움 - element_by_tag

 

마찬가지로 <ul class="gugun_area_box" >하위에 <li>태그로 구 이름들이 묶여져 있습니다.

 

gugun = driver.find_element_by_class_name('gugun_arae_box')
li=gugun.find_elements_by_tag_name('li') #<li>태그 감싸고 있는 전체 서울의 구들 리스트로 반환
li[1].click()#인덱스로 강남구 접근
time.sleep(20)

서울 강남구에는 전체 80개의 매장이 위치하고 있는데요, 매장명과 매장 주소를 불러 들여 보겠습니다.

source=driver.page_source

bs=BeautifulSoup(source,'lxml')
entire=bs.find('ul', class_='quickSearchResultBoxSidoGugun')
starbucksGangnam_list=entire.find_all('li')

print("매장 수 : ", len(starbucksGangnam_list))
for stores in starbucksGangnam_list:
    print("매장명 :", stores.find('strong').text, "매장 주소 :" , stores.find('p').text)

우선 driver.page_source로 크롬 브라우저의 현재 페이지의 html source들을 불러들여 source에 담아줍니다.

Selenium Web Driver API 참조

 

크롤링한 강남구 매장 정보를 BeautifulSoup을 이용해서 HTML에서 필요한 텍스트만 추출해 보겠습니다. 전체 매장수와 매장명 그리고 매장 주소를 위와 같은 코드로 얻을 수 있습니다.

 

강남구 매장 리스트는 <ul class="quickSearchResultBoxSidoGugun>하위에 <li>태그로 각각의 매장 정보를 구성하고 있습니다. <li> 태그는 자식 태그로 <strong> , <p>, <i> 태그를 가지고 있는데요, 가자 상단에 해당하는 '도산가로수길' 태그를 확인해 보면 추출하고자 하는 매장명은 <strong>에, 주소는 <p>태그 사이에 표시되어 있습니다.

 

For문을 써서 starbucksGangnam_list에 저장한 stores 소스에서 <strong>태그와 <p>태그에 표시된 매장명과 주소를 추출하고, 리스트의 길이를 확인하기 위해 len을 써서 상단에 매장 수를 함께 print 했습니다.

 

강남구 스벅매장 리스트 태그 확인
강남구 스벅매장정보 태그

 

실행 결과 창입니다. 브라우저 페이지와 동일하게 매장 수 80개 +원하는 매장명, 매장주소 함께 출력되었습니다.

스벅매장 크롤링 실행 결과

 

전체 코드 정리하면 다음과 같습니다.

from bs4 import BeautifulSoup
from selenium import webdriver
import time

driver = webdriver.Chrome('./crawling/data/chromedriver')
driver.get('https://www.starbucks.co.kr/store/store_map.do?disp=locale')
time.sleep(20)

loca = driver.find_element_by_class_name('loca_search')
loca.click()
time.sleep(20)

sido = driver.find_element_by_class_name('sido_arae_box')
li=sido.find_elements_by_tag_name('li')
li[0].click()
time.sleep(20)

gugun = driver.find_element_by_class_name('gugun_arae_box')
li=gugun.find_elements_by_tag_name('li')
li[1].click()
time.sleep(20)

source=driver.page_source

bs=BeautifulSoup(source,'lxml')
entire=bs.find('ul', class_='quickSearchResultBoxSidoGugun')
starbucksGangnam_list=entire.find_all('li')

print("매장 수 : ", len(starbucksGangnam_list))
for stores in starbucksGangnam_list:
    print("매장명 :", stores.find('strong').text, "매장 주소 :" , stores.find('p').text)

 지역명과 시군구의 리스트 인덱스 잘 확인하셔서 다른 지역으로도 검색해보세요!

 

다음주에 pandas 진도를 들어가는터라^^ 다음부터는 데이터 프레임으로 만들고 정보도 요약해 보겠습니다.

블로그에 이렇게 정리하는데 시간은 꽤 걸리지만 쓰면서 찾아보며 나름 정리가 되는 것 같아서 실습해본 내용들 계속해서 업데이트 해보겠습니다. 쓰이는 용어들을 차라리...영어로만 통일하면 좋으련만 한글이 어째 더 어렵습니다...;;

 

파이썬 크롤링 실습
파이썬 크롤링으로 스타벅스 매장정보 수집

 

자료 추출 - 처리 및 해석을 위해서는 수학이 필수일텐데 험난한 여정이긴 하네요ㅎ(주말은 수학의 세계로...)

반응형