ABOUT ME

IT와 컴퓨터 관련 팁, 파이썬 등과 아파트 정보, 일상적인 경험 등의 생활 정보를 정리해서 올리는 개인 블로그

  • 블로그 글 복사 - 네이버 블로그 텍스트 추출
    코딩 연습/코딩배우기 2024. 11. 24. 22:29
    반응형

     

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

     

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

     

     

    프로그램 다운로드

     

     

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

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

     

    프로그램 사용법 보기

     

    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 프로그램이며, 네이버 블로그 페이지의 텍스트를 추출하고, 파일로 저장하는 기능이 포함되어 있습니다.

     

    반응형
Designed by goodthings4me.