본문 바로가기
코딩 연습/코딩배우기

블로그 글 복사 - 네이버 블로그 텍스트 추출

by good4me 2024. 11. 24.

goodthings4me.tistory.com

네이버 블로그의 텍스트가 필요할 때 마우스 문장 하나씩 드래그하여 복사하는 방법도 있고, 혹시 블로그 글 복사 방지가 되어있을 때 브라우저의 설정에서 막힌 스크립트를 풀고 드래그를 하는 방법도 있지만, 아래처럼 프로그램을 만들어서 사용하는 방법도 있습니다.

 

블로그 글 복사 - 네이버 블로그 텍스트 추출

 

 

프로그램 다운로드

 

 

네이버 블로그 텍스트 추출하기

위 프로그램의 소스코드는 다음과 같습니다.

 

프로그램 사용법 보기

 

import re
from tkinter import *
import tkinter as tk
import tkinter.messagebox as msgbox
import webbrowser
import requests
from bs4 import BeautifulSoup


root = Tk()
root.title('네이버 블로그 텍스트 추출')
root.geometry('450x400+700+100')
root.resizable(False, False)


def extract_nblog(blog_url):
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
    }
    
    list_content_view.delete(0, END)  # 리스트박스 내 모든 item 제거
    list_content_view.insert(END, '블로그 텍스트 추출중...')
    list_content_view.update()

    ## iframe태그 찾아서 포스팅 URL 얻기
    res = requests.get(blog_url, headers=headers)
    soup = BeautifulSoup(res.text, 'html.parser')
    iframe = soup.find('iframe', id='mainFrame')  
    post_url = f'''https://blog.naver.com{iframe['src']}'''

    ## 포스팅 내용 추출하기
    response = requests.get(post_url, headers=headers)
    soup2 = BeautifulSoup(response.text, 'html.parser')
    post_body = soup2.find('div', id='postListBody')

    # 제목 추출
    blog_title = ''
    if blog_tit := post_body.find('div', class_= 'pcol1'):
        if blog_tit.find('span'):
            blog_title = blog_tit.find('span').text.strip().replace('\n', '')
        else:
            blog_title = blog_tit.find('h3').text.strip().replace('\n', '')
        print(f'\n[title] : {blog_title}')

    list_content_view.insert(END, '블로그 제목:')
    list_content_view.insert(END, blog_title)
    list_content_view.update()

    # 등록일 추출
    blog_regist_day = ''
    if blog_regist := post_body.find('span', class_= re.compile('^se_publishDate pcol2.*')):
        blog_regist_day = blog_regist.text.strip().replace('\n', '')
        print(f'\n[regist_day] : {blog_regist_day}')

    list_content_view.insert(END, blog_regist_day)
    list_content_view.update()

    # 본문 내용 추출
    if pbody := post_body.find('div', class_='se-main-container'):
        body_content = pbody.find_all('p')
    elif pbody := post_body.find('div', id='postViewArea'):
        body_content = pbody.find_all('p')
    elif pbody := post_body.find('div', {'class': re.compile('^se_component_wrap sect_dsc __se_component_area.*')}):
        body_content = pbody.find_all('p')
    else:
        body_content = pbody.find_all('p')

    # 텍스트를 단일 문자열로 연결
    extracted_text = '\n'.join(p.get_text() for p in body_content if p.get_text().strip())

    list_content_view.insert(END, extracted_text)
    list_content_view.update()
    list_content_view.insert(END, '추출 완료...')
    list_content_view.update()

    ## 블로그 텍스트 저장
    body_contents = '\n[제목] : ' + blog_title + ' [' + blog_regist_day + ']\n[블로그 URL] : ' + blog_url + '\n\n[글 본문] : \n' + extracted_text
    with open('./' + blog_title + '.txt', 'w', encoding='utf-8') as f:
        f.write(body_contents)
        print('\n블로그 텍스트 저장 완료!\n')

    return True


def func_quit():
    root.quit()  # root.destroy()

def read_me():
    msgbox.showwarning('Info', '네이버 블로그 텍스트 파일을 추출하여 파일로 저장합니다.\n\n'
                             '네이버 블로그 브라우저에서 URL전체, 예로 "https://blog.naver.com/borame365/223608080184"를 복사후 붙여넣기합니다.\n'
                             '"추출 시작" 버튼을 클릭하면 네이버 블로그의 텍스트가 추출됩니다.\n\n'
                             '본 프로그램이 있는 경로(폴더)에 "제목.txt" 파일로 저장됩니다.\n')

def callback(url):
    webbrowser.open_new(url)


# 시작 버튼
def start():
    # 입력란이 비었는지 확인
    if not len(txt_entry_url.get()):  # len(txt_dest_path.get()) == 0:
        msgbox.showwarning('Info', '네이버 블로그 주소(URL)를 입력하세요!')
        return
    
    url = txt_entry_url.get()  # naver keyword
    # save_dir = txt_dest_path.get()  # save path

    if "blog.naver.com" not in url:
        msgbox.showwarning('Info', '네이버 블로그 주소(URL)를 입력하세요!')
        txt_entry_url.delete(0, tk.END)
        return

    if len(txt_entry_url.get()):
        state_var.set(f'실행중.....')
        root.update_idletasks()

        down_result = extract_nblog(url)  # 함수 호출
        if down_result:
            state_var.set('추출 작업 완료..!!')
        else:
            state_var.set('중지됨..!!')

    else:
        msgbox.showerror('오류', '내용을 정확하게 입력하세요!')
        return


# 사용법 표시 들어갈 공간
lbl_use_frame = Frame(root)
lbl_use_frame.pack(fill='x', padx=2, pady=2)

txt_url = '사용법>>'
lbl_url_txt = Label(lbl_use_frame, text=txt_url, font=('Helveticabold', 10, 'bold'), justify='left', fg='blue', cursor='hand2')
lbl_url_txt.pack(side='right', fill='x', padx=7, pady=5, ipadx=1)
lbl_url_txt.bind('<Button-1>', lambda e: callback('https://itssu.kr/%eb%84%a4%ec%9d%b4%eb%b2%84-%eb%b8%94%eb%a1%9c%ea%b7%b8-%eb%b3%b5%ec%82%ac-%ea%b8%88%ec%a7%80-%ed%85%8d%ec%8a%a4%ed%8a%b8-%ec%b6%94%ec%b6%9c/'))


# URL 입력 설명 LabelFrame
url_frame = LabelFrame(root, text="네이버 블로그 URL(https:// 포함) 입력 후 '추출 시작' 버튼을 클릭하세요.")
url_frame.pack(fill="x", padx=10, pady=5, ipady=5)

# URL 입력 레이블
lbl_url = Label(url_frame, text='블로그 URL :', width=10)
lbl_url.configure(font=('Arial', 10, 'bold'))
lbl_url.pack(side='left', padx=5, pady=5)

# URL 입력 란
txt_entry_url = Entry(url_frame)
txt_entry_url.insert(0, '')
txt_entry_url.pack(side='left', fill='x', expand=True, padx=5, pady=5)

# URL 추출 - 텍스트 파일 저장 알림
lbl_ex_frame = Frame(root)
lbl_ex_frame.pack(fill='x', padx=8, pady=0)

lbl_ex_url1 = Label(lbl_ex_frame, text="* 본 프로그램이 있는 폴더에 '제목.txt' 파일로 저장됨")
lbl_ex_url1.pack(side='left')

# URL 입력 레이블 - 오른쪽(Read Me)
btn_url = Button(lbl_ex_frame, text='Read Me', width=7, command=read_me)
btn_url.pack(side='right', padx=5, pady=5)


# 리스트 프레임 - 데이터 추출 시 보이게 하는 Listbox 공간의 프레임
list_frame = Frame(root)
list_frame.pack(fill='both', padx=10, pady=5)

# 리스트박스 우측 스크롤
scrollbar = Scrollbar(list_frame)
scrollbar.pack(side='right', fill='y')

# 리스트박스 - 데이터 출력 현황 보이게 하는 곳
list_content_view = Listbox(list_frame, height=8, yscrollcommand=scrollbar.set)
list_content_view.pack(side='left', fill='both', expand=True)
scrollbar.config(command=list_content_view.yview)

# 프로그램 실행 표시 들어갈 공간
lbl_execute_frame = Frame(root)
lbl_execute_frame.pack(fill='x', padx=5, pady=5)

state_var = StringVar()
state_var.set(' ')
lbl_state_txt = Label(lbl_execute_frame, textvariable=state_var)
lbl_state_txt.configure(font=('Arial', 12, 'bold', 'italic'))
lbl_state_txt.pack(side='right', fill='x', padx=5, pady=5)

# 실행 프레임 - 시작, 닫기
frame_run = Frame(root)
frame_run.pack(fill='x', padx=10, pady=5)

btn_close = Button(frame_run, padx=5, pady=5, text='닫기', width=12, fg='black', cursor='hand2', command=func_quit)
btn_close.pack(side='right', padx=5, pady=5)

btn_start = Button(frame_run, padx=5, pady=5, text='추출 시작', width=12, fg='black', cursor='hand2', command=start)
btn_start.configure(font=('Arial', 10, 'bold'))
btn_start.pack(side='right', padx=5, pady=5)

root.mainloop()

 

 

 

위 코드는 파이썬 tkinter로 만든 GUI 프로그램이며, 네이버 블로그 페이지의 텍스트를 추출하고, 파일로 저장하는 기능이 포함되어 있습니다.

 

댓글