diff --git a/naver_review/main.py b/naver_review/main.py new file mode 100644 index 0000000..879bb51 --- /dev/null +++ b/naver_review/main.py @@ -0,0 +1,81 @@ +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.chrome.options import Options +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +import config # config.py에서 PLACE_ID, MAX_REVIEWS를 불러옴 + +def setup_driver(): + chrome_options = Options() + # 헤드리스 모드 필요하면 아래 주석 해제 + chrome_options.add_argument("--headless=new") + chrome_options.add_argument("--no-sandbox") + chrome_options.add_argument("--disable-dev-shm-usage") + chrome_options.add_argument( + "--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) " + "AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1" + ) + print("[INFO] Chrome WebDriver 실행 중...") + return webdriver.Chrome(options=chrome_options) + +def crawl_naver_place_reviews(place_id, max_reviews=50): + url = f"https://m.place.naver.com/place/{place_id}/review/visitor?reviewSort=recent" + driver = setup_driver() + print(f"[INFO] 리뷰 페이지 접속: {url}") + driver.get(url) + + wait = WebDriverWait(driver, 10) + wait.until(EC.presence_of_element_located((By.ID, "_review_list"))) + + ul = driver.find_element(By.ID, "_review_list") + items = ul.find_elements(By.XPATH, './/li[contains(@class, "place_apply_pui")]') + + reviews = [] + + for item in items: + try: + # 작성자 + try: + writer = item.find_element(By.XPATH, './div[1]/a[2]/div[1]/span/span').text.strip() + except: + writer = "익명" + + # 날짜 (요청하신 정확한 위치) + try: + date = item.find_element(By.XPATH, './div[7]/div[2]/div/span[1]/span[2]').text.strip() + except: + date = "날짜 없음" + + # 리뷰 본문 + try: + text = item.find_element(By.XPATH, './div[5]/a').text.strip() + except: + text = "" + + if text: + reviews.append({ + "writer": writer, + "date": date, + "text": text + }) + + if len(reviews) >= max_reviews: + break + except Exception as e: + print(f"[WARN] 리뷰 추출 실패: {e}") + + + + + + driver.quit() + print(f"[DONE] 총 {len(reviews)}개 리뷰 수집 완료") + return reviews + +if __name__ == "__main__": + result = crawl_naver_place_reviews(config.PLACE_ID, config.MAX_REVIEWS) + + print("\n==== [리뷰 목록] ====") + for i, r in enumerate(result, 1): + print(f"{i}. 작성자: {r['writer']}, 날짜: {r['date']}") + print(f" 내용: {r['text']}\n")