네이버 리뷰 통합을 위한 부분.
This commit is contained in:
81
naver_review/main.py
Normal file
81
naver_review/main.py
Normal file
@ -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")
|
||||
Reference in New Issue
Block a user