Python

Python으로 GUI 기반 티스토리 블로그 포스팅 개수 크롤링 및 관리 기능 구현

creato 2025. 2. 14. 19:25
728x90
반응형
SMALL

Python과 Tkinter를 활용한 블로그 포스팅 개수 크롤링 업그레이드

기존에는 명령줄에서 블로그의 포스팅 개수를 확인하는 방식이었으나 이번에는 GUI를 활용하여 사용자 친화적인 환경을 구축하였다. 블로그 이름과 URL을 직접 입력하여 목록을 추가할 수 있으며 크롤링 버튼을 통해 블로그의 포스팅 개수를 확인할 수 있다. 또한 삭제 기능을 통해 필요 없는 블로그를 목록에서 제거할 수 있도록 하였다.

 

 

개발 환경 및 필요 라이브러리

본 프로그램은 Python과 Tkinter 라이브러리를 활용하여 GUI 환경을 구현하였다. 또한 웹 크롤링을 위해 requests와 BeautifulSoup을 사용하였으며 데이터를 저장하기 위해 json을 활용하였다. 필요한 라이브러리는 다음 명령어로 설치할 수 있다.

pip install requests beautifulsoup4 lxml pandas

 

 

 

블로그 목록을 저장하고 불러오는 기능 추가

기존에는 프로그램 실행 시 블로그 목록을 수동으로 입력해야 했으나 이번 업그레이드에서는 블로그 목록을 로컬 파일(blog.json)에 저장하여 유지할 수 있도록 개선하였다. 프로그램 실행 시 자동으로 저장된 데이터를 불러와 블로그 목록을 유지하며 새로운 블로그 추가 및 삭제 시에도 즉시 반영된다.

 

 

블로그 포스팅 개수 크롤링 원리

티스토리 블로그의 포스팅 개수는 HTML 구조상 특정 span 태그(class="c_cnt")에 저장되어 있다. 이를 크롤링하는 과정은 다음과 같다.

  1. requests 라이브러리를 사용하여 블로그 URL에서 HTML 데이터를 가져온다.
  2. BeautifulSoup을 활용하여 HTML을 파싱한다.
  3. find() 메서드를 이용하여 span 태그 내 c_cnt 클래스를 찾고 해당 값에서 숫자만 추출한다.
  4. 크롤링된 포스팅 개수를 GUI 테이블에 표시한다.

 

 

블로그 추가 및 삭제 기능 구현

사용자는 블로그 이름과 URL을 입력한 후 "추가" 버튼을 눌러 블로그 목록에 등록할 수 있다. 추가된 블로그는 JSON 파일에 저장되며 프로그램 종료 후에도 유지된다. 삭제 기능을 통해 목록에서 선택한 블로그를 제거할 수 있으며 이때 JSON 파일에서도 삭제가 반영된다.

 

 

GUI를 활용한 데이터 출력

블로그 목록과 포스팅 개수를 직관적으로 확인할 수 있도록 Treeview 위젯을 사용하여 데이터를 표 형태로 출력하였다. 크롤링 버튼을 클릭하면 각 블로그의 최신 포스팅 개수가 자동으로 업데이트되며 전체 포스팅 개수의 합계도 함께 계산하여 표시한다.

 

 

 

 

개선된 GUI 기반 코드

아래는 블로그 추가, 삭제, 크롤링 기능이 포함된 최종 코드이다.

import tkinter as tk
from tkinter import messagebox, ttk
import requests
from bs4 import BeautifulSoup
import pandas as pd
import json
import os

# 📌 로컬 파일 경로
FILE_PATH = "blogs.json"

# 📌 블로그 목록 불러오기
def load_blogs():
    if os.path.exists(FILE_PATH):
        with open(FILE_PATH, "r", encoding="utf-8") as file:
            data = json.load(file)
            if isinstance(data, dict):  # 딕셔너리인지 확인
                return data
            elif isinstance(data, list):  # 리스트라면 딕셔너리로 변환
                return {item[0]: item[1] for item in data}
    return {}

# 📌 블로그 목록 저장
def save_blogs():
    with open(FILE_PATH, "w", encoding="utf-8") as file:
        json.dump(blogs, file, indent=4, ensure_ascii=False)

# 📌 블로그 포스팅 개수 크롤링 함수
def fetch_post_count(url):
    try:
        response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, 'lxml')
            post_count_element = soup.find("span", class_="c_cnt")  # HTML 요소 수정 필요
            if post_count_element:
                return int(post_count_element.text.strip("()"))
        return 0
    except:
        return 0

# 📌 블로그 추가
def add_blog():
    name = name_entry.get().strip()
    url = url_entry.get().strip()
    
    if not name or not url:
        messagebox.showwarning("입력 오류", "블로그 이름과 URL을 입력해주세요!")
        return
    
    if name in blogs:
        messagebox.showwarning("중복 오류", "이미 존재하는 블로그 이름입니다!")
        return
    
    blogs[name] = url
    save_blogs()
    update_table()
    name_entry.delete(0, tk.END)
    url_entry.delete(0, tk.END)

# 📌 블로그 삭제
def remove_blog():
    selected = tree.selection()
    if not selected:
        messagebox.showwarning("삭제 오류", "삭제할 블로그를 선택해주세요!")
        return
    
    for item in selected:
        blog_name = tree.item(item, "values")[0]
        if blog_name in blogs:
            del blogs[blog_name]
    
    save_blogs()
    update_table()

# 📌 테이블 업데이트 (크롤링 실행 + 합계 계산)
def update_table():
    for row in tree.get_children():
        tree.delete(row)

    total_count = 0
    data = []
    
    for name, url in blogs.items():
        post_count = fetch_post_count(url)
        total_count += post_count
        data.append((name, url, post_count))

    for entry in data:
        tree.insert("", "end", values=entry)

    # 📌 총 포스팅 개수 업데이트
    total_label.config(text=f"총 포스팅 개수: {total_count} 개")

# 📌 GUI 설정
root = tk.Tk()
root.title("블로그 포스팅 개수 크롤링")
root.geometry("600x450")

# 📌 블로그 목록 불러오기
blogs = load_blogs()

# 📌 입력 필드
frame = tk.Frame(root)
frame.pack(pady=10)

tk.Label(frame, text="블로그 이름:").grid(row=0, column=0, padx=5)
name_entry = tk.Entry(frame, width=20)
name_entry.grid(row=0, column=1, padx=5)

tk.Label(frame, text="블로그 URL:").grid(row=0, column=2, padx=5)
url_entry = tk.Entry(frame, width=30)
url_entry.grid(row=0, column=3, padx=5)

tk.Button(frame, text="추가", command=add_blog).grid(row=0, column=4, padx=5)

# 📌 블로그 테이블 (그리드)
columns = ("블로그 이름", "블로그 URL", "포스팅 개수")
tree = ttk.Treeview(root, columns=columns, show="headings")
tree.heading("블로그 이름", text="블로그 이름")
tree.heading("블로그 URL", text="블로그 URL")
tree.heading("포스팅 개수", text="포스팅 개수")

tree.pack(expand=True, fill="both", padx=10, pady=10)

# 📌 총 포스팅 개수 표시 라벨
total_label = tk.Label(root, text="총 포스팅 개수: 0 개", font=("Arial", 12, "bold"))
total_label.pack(pady=5)

# 📌 삭제 버튼
tk.Button(root, text="삭제", command=remove_blog, fg="red").pack(pady=5)

# 📌 테이블 초기 로딩
update_table()

# 📌 실행
root.mainloop()

 

 

 

파이썬으로 티스토리 블로그 포스팅 개수 가져오기 : 4개 블로그 지원 및 합계 기능 추가

파이썬을 활용한 티스토리 블로그 크롤링 업그레이드티스토리 블로그의 포스팅 개수를 자동으로 가져오는 프로그램을 개선하였다. 기존에는 단일 블로그에서만 개수를 가져올 수 있었지만 이

creatolog.tistory.com

 

 

728x90
반응형
LIST