홍대, 강남, 성수, 이태원 등 주요 핫플레이스를 돌아다닐 때 네이버, 카카오, 인스타그램에서 주요 가볼만한 곳을 찾게 되는데요.
그걸 착안해서 이부분을 자동화해보면 재밌을 거 같아서 한번 구현해보았습니다.
주요 시나리오는 아래와 같습니다.
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()
코드 실행시 콘솔에 맞춰서 깔끔하게 결과가 노출되는 걸 확인할 수 있습니다.
지도에서 검색한 것 보다 한눈에 보기 편하기도 해서 좀 더 코드를 개선하면 유용하게 사용할 수 있는 자동화가 될 수 있을듯 합니다.
'자동화 > Selenium' 카테고리의 다른 글
중고 할인 기프티콘 인기 목록 자동화로 확인하기 (기프티스타) (0) | 2024.02.03 |
---|---|
밴드웹에서 밴드 글을 자동으로 써보기 (1) | 2024.02.03 |
AWS 인스턴스 환경 세팅 절차 Selenium 자동화로 구현하기 (0) | 2024.02.02 |
Selenium 텍스트 입력창 지우는 방법들 (Clear, Keys..) (1) | 2024.02.02 |
Selenium으로 밴드웹 자동 로그인 해보기 (0) | 2024.02.02 |