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()