diff --git a/naver_review/run.py b/naver_review/run.py new file mode 100644 index 0000000..ed90828 --- /dev/null +++ b/naver_review/run.py @@ -0,0 +1,89 @@ +import tkinter as tk +from tkinter import ttk, scrolledtext, messagebox +from datetime import datetime, timedelta +import threading +import main # main.py가 같은 폴더에 있어야 함 + +def get_yesterday_str(): + return (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d") + +def run_crawler_thread(place_ids, start_date, end_date, output_widget, run_button): + def task(): + try: + output_widget.config(state='normal') + output_widget.delete("1.0", tk.END) + output_widget.insert(tk.END, f"크롤링 시작: {start_date} ~ {end_date}\n\n") + + start_date_obj = datetime.strptime(start_date, "%Y-%m-%d").date() + end_date_obj = datetime.strptime(end_date, "%Y-%m-%d").date() + + for place_id in place_ids: + output_widget.insert(tk.END, f"[업체 ID: {place_id}] 리뷰 수집 중...\n") + shop_name, reviews = main.crawl_reviews_within_range(place_id, start_date_obj, end_date_obj) + + output_widget.insert(tk.END, f"업체명: {shop_name}\n") + output_widget.insert(tk.END, f"수집 리뷰 수: {len(reviews)}\n") + + for i, r in enumerate(reviews, 1): + output_widget.insert(tk.END, f"{i}. 작성자: {r['writer']}, 날짜: {r['date']}\n") + output_widget.insert(tk.END, f" 내용: {r['text']}\n") + + output_widget.insert(tk.END, "\n") + + output_widget.insert(tk.END, "크롤링 완료!\n") + output_widget.config(state='disabled') + except Exception as e: + messagebox.showerror("오류", f"크롤링 중 오류 발생:\n{e}") + output_widget.config(state='disabled') + finally: + run_button.config(state='normal') + + run_button.config(state='disabled') + threading.Thread(target=task, daemon=True).start() + +def create_gui(): + root = tk.Tk() + root.title("네이버 플레이스 리뷰 크롤러") + + frm = ttk.Frame(root, padding=10) + frm.grid() + + ttk.Label(frm, text="시작일 (YYYY-MM-DD):").grid(column=0, row=0, sticky='w') + start_entry = ttk.Entry(frm, width=15) + start_entry.grid(column=1, row=0) + start_entry.insert(0, get_yesterday_str()) + + ttk.Label(frm, text="종료일 (YYYY-MM-DD):").grid(column=0, row=1, sticky='w') + end_entry = ttk.Entry(frm, width=15) + end_entry.grid(column=1, row=1) + end_entry.insert(0, get_yesterday_str()) + + output = scrolledtext.ScrolledText(frm, width=80, height=25, state='disabled') + output.grid(column=0, row=3, columnspan=3, pady=10) + + def on_run(): + start_date = start_entry.get() + end_date = end_entry.get() + + # 날짜 형식 검증 + try: + datetime.strptime(start_date, "%Y-%m-%d") + datetime.strptime(end_date, "%Y-%m-%d") + except ValueError: + messagebox.showerror("입력 오류", "날짜 형식을 YYYY-MM-DD 로 입력하세요.") + return + + place_ids = getattr(main.config, "PLACE_IDS", []) + if not place_ids: + messagebox.showerror("설정 오류", "config.py에 PLACE_IDS 리스트가 비어있습니다.") + return + + run_crawler_thread(place_ids, start_date, end_date, output, run_button) + + run_button = ttk.Button(frm, text="실행", command=on_run) + run_button.grid(column=0, row=2, pady=5) + + root.mainloop() + +if __name__ == "__main__": + create_gui()