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 프로그램이며, 네이버 블로그 페이지의 텍스트를 추출하고, 파일로 저장하는 기능이 포함되어 있습니다.
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
티스토리 글쓰기 - 파이썬 selenium 자동 등록 코드 (0) | 2024.11.21 |
---|---|
html color에 사용할 rgb 색상표 만들기 (0) | 2024.09.08 |
블로그스팟 포스팅 URL 글 목록 전체 가져오기 (0) | 2024.08.25 |
파이썬 워드클라우드 설치, konlpy Okt() 사용 (0) | 2024.02.14 |
파이썬 도서관리 프로그램 (0) | 2024.01.03 |
댓글