90 lines
3.4 KiB
Python
90 lines
3.4 KiB
Python
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()
|