지역 음식점 자동화로 추출하여 확인 (with kakao)

  • by

홍대, 강남, 성수, 이태원 등 주요 핫플레이스를 돌아다니면 네이버, 카카오, 인스타그램에서 주요 볼거리를 찾게 됩니다.

그것을 착안해 이 부분을 자동화해 보면 재미있을 것 같았으므로 한번 실장해 보았습니다.

주요 시나리오는 다음과 같습니다.

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 코드 에러 발생으로 대체
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()

코드가 실행될 때 콘솔에 맞게 제대로 결과가 노출되는지 확인할 수 있습니다.

지도에서 검색한 것보다 한눈에 알기 쉽고, 좀 더 코드를 개선하면 편리하게 사용할 수 있는 자동화가 될 것 같습니다.