본문 바로가기

자동화/Selenium

지역 맛집 리스트 자동화로 추출해서 확인하기 (with 카카오맵)

728x90

홍대, 강남, 성수, 이태원 등 주요 핫플레이스를 돌아다닐 때 네이버, 카카오, 인스타그램에서 주요 가볼만한 곳을 찾게 되는데요.

그걸 착안해서 이부분을 자동화해보면 재밌을 거 같아서 한번 구현해보았습니다.

 

주요 시나리오는 아래와 같습니다.

 

1. 카카오맵에서 특정 검색어로 검색한다. (예: 성수 맛집)

2. 검색결과 리스트를 추출하여 콘솔에 출력한다.

 

카카오맵의 특정 검색어을 검색한 결과의 URL로 바로 접근하는 방식을 사용하였습니다.

저는 "성수 맛집"을 검색하였는데 상황에 맞게 "홍대역 카페", "강남역 고기" 등 원하는 데이터에 맞게 검색어를 변경하여 사용할 수 있습니다.

 

driver.get('https://map.kakao.com/?from=total&nil_suggest=btn&q=%EC%84%B1%EC%88%98%20%EB%A7%9B%EC%A7%91&tab=place')

 

검색결과 중 필요한 데이터들을 find_elements를 사용하여 추출합니다.

(가게명, 평점, 리뷰수, 카테고리명)

 

nameList = driver.find_elements(By.CLASS_NAME, 'link_name')
numList = driver.find_elements(By.CLASS_NAME, 'score')
reviewList = driver.find_elements(By.CLASS_NAME, 'review')
categoryList = driver.find_elements(By.CLASS_NAME, 'subcategory.clickable')

 

추출하려고 하는 find_elements 모든 데이터의 개수가 동일하기 때문에 하나의 반복문을 통해 각각의 데이터를 콘솔에 출력하였습니다.

 

for i in range(0, len(nameList)):
    print(str(number) + " [" + nameList[i].text + "] [" + categoryList[i].text + "] 평점: "
          + numList[i].find_element(By.TAG_NAME, 'em').text
          + " 리뷰: " + reviewList[i].find_element(By.TAG_NAME, 'em').text)
    number = number + 1

 

 

카카오맵의 경우 페이지별로 15개의 리스트를 출력하는데 다음 버튼을 누르기 위해 click을 사용하였더니

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted 에러가 발생하였습니다.

 

에러를 제거하기 위해 click 대신 send_keys(Keys.ENTER)를 사용하여 해결하였습니다.

해당 해결방법은 위 에러 외 click이 올바르게 동작되지 않을 때 사용할 수 있는 유용한 방법이라 알고계시면 도움이 됩니다.

 

# click 코드 에러 발생으로 대체
driver.find_element(By.ID, 'info.search.page.no2').send_keys(Keys.ENTER)
#driver.find_element(By.ID, 'info.search.page.no2').click()

 

전체 코드입니다.

해당 코드로는 30개의 데이터를 추출할 수 있지만 검색어 변경 반복문 및 페이지 버튼 코드 변경으로 더 많은 데이터를 추출할 수도 있습니다.

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
from selenium.webdriver import ActionChains, Keys

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

driver.get('https://map.kakao.com/?from=total&nil_suggest=btn&q=%EC%84%B1%EC%88%98%20%EB%A7%9B%EC%A7%91&tab=place')

number = 1

for j in range(0, 2):
    nameList = driver.find_elements(By.CLASS_NAME, 'link_name')
    numList = driver.find_elements(By.CLASS_NAME, 'score')
    reviewList = driver.find_elements(By.CLASS_NAME, 'review')
    categoryList = driver.find_elements(By.CLASS_NAME, 'subcategory.clickable')

    for i in range(0, len(nameList)):
        print(str(number) + " [" + nameList[i].text + "] [" + categoryList[i].text + "] 평점: "
              + numList[i].find_element(By.TAG_NAME, 'em').text
              + " 리뷰: " + reviewList[i].find_element(By.TAG_NAME, 'em').text)
        number = number + 1

    driver.find_element(By.ID, 'info.search.page.no2').send_keys(Keys.ENTER)
    #driver.find_element(By.ID, 'info.search.page.no2').click()
    time.sleep(2)

driver.close()

 

코드 실행시 콘솔에 맞춰서 깔끔하게 결과가 노출되는 걸 확인할 수 있습니다.

지도에서 검색한 것 보다 한눈에 보기 편하기도 해서 좀 더 코드를 개선하면 유용하게 사용할 수 있는 자동화가 될 수 있을듯 합니다.

 

728x90