open API + docx + GUI + GUI 메뉴 탭 만들기
# open API + docx 함수 정의
def naverBlogOpenAPI_to_docx(x,y,z,m) :
# x = 검색어
# y = start_point
# z = display_count
# m = word 파일 내에서 페이지 나누는 기준 건수
import requests
from urllib.parse import urlparse
import docx
# docx 파일 생성
wordfile = docx.Document()
# 헤더 생성
wordfile.add_heading('open API 활용 네이버 블로그 검색 결과 크롤링', 0)
wordfile.add_heading("검색어 : " + str(x) + "\t/" + "검색 결과 : 총 " + str(y * z) + "개", 1)
keyword = str(x)
i = 1
cnt = 0
for i in range(1, y+1) :
if i == 1 :
url = "https://openapi.naver.com/v1/search/blog?query=" + \
keyword + "&display=" + str(z) + "&start=" + str(i)
elif i > 1 :
url = "https://openapi.naver.com/v1/search/blog?query=" + \
keyword + "&display=" + str(z) + "&start=" + str((i-1)*z + 1)
result = requests.get(urlparse(url).geturl(),
headers={"X-Naver-Client-Id":"_______",
"X-Naver-Client-Secret":"_______"})
json_data = result.json()
for item in json_data['items']:
cnt += 1
globals()['blog_result{}'.format(cnt)] = \
wordfile.add_heading(item['title'].replace("<b>", "").replace("</b>", ""), 4)
globals()['blog_result{}'.format(cnt)] = \
wordfile.add_paragraph(item['description'].replace("<b>", "").replace("</b>","") + "\n")
if (cnt) % m == 0 :
next_page = globals()['blog_result{}'.format(cnt)].add_run()
next_page.add_break(docx.text.run.WD_BREAK.PAGE)
wordfile.save("C:/Users/student/Desktop/python/P_3week/연습2(openAPI+docx+GUI+menu).docx")
# GUI 만들기
import tkinter as tk
from tkinter import ttk
# 인스턴스 만들기
win = tk.Tk()
# 타이틀 정하기
win.title("Bigdata GUI")
# 창 사이즈
win.geometry("640x480")
# 사이즈 조절 가능 여부 설정 (세로, 가로)
win.resizable(True, True) # (세로 고정, 가로 조절 가능)
# ==================
# tab 만들기
# ==================
tabControl = ttk.Notebook(win) # Create Tab Control
tab1 = ttk.Frame(tabControl) # Create a tab
tabControl.add(tab1, text='Naver 블로그 검색') # Add the tab
tab2 = ttk.Frame(tabControl) #
tabControl.add(tab2, text='프로젝트1') # Add a second tab
tab3 = ttk.Frame(tabControl) #
tabControl.add(tab3, text='프로젝트2') # Add a third tab
tabControl.pack(expand=1, fill="both") # Pack to make visible
# ==================
# label frame 만들기
# ==================
# LabelFrame using tab1 as the parent
srch = ttk.LabelFrame(tab1, text='검색조건 입력')
srch.grid(column=0, row=0, padx=20, pady=20)
# 레이블 추가 (레이블 프레임 안에)
label = ttk.Label(srch, text = "검색어를 입력하세요 :")
label.grid(column = 0, row = 1)
label2 = ttk.Label(srch, text = "start_point를 입력하세요 :")
label2.grid(column = 0, row = 2)
label3 = ttk.Label(srch, text = "display_count를 입력하세요 :")
label3.grid(column = 0, row = 3)
label4 = ttk.Label(srch, text = "페이지 나눌 기준 건수 :")
label4.grid(column = 0, row = 4)
# 텍스트 박스 추가 (레이블 프레임 안에)
## 첫번째 텍스트 박스 : 검색어 값
name = tk.StringVar()
name_entered = ttk.Entry(srch, width = 12, textvariable = name)
name_entered.grid(column=1, row=1)
## 두번째 텍스트 박스 : start_point 값
name2 = tk.StringVar()
name2_entered = ttk.Entry(srch, width = 12, textvariable = name2)
name2_entered.grid(column=1, row=2)
## 세번째 텍스트 박스 : display_count 값
name3 = tk.StringVar()
name3_entered = ttk.Entry(srch, width = 12, textvariable = name3)
name3_entered.grid(column=1, row=3)
## 네번째 텍스트 박스 : 페이지 나눌 기준 건수 값
name4 = tk.StringVar()
name4_entered = ttk.Entry(srch, width = 12, textvariable = name4)
name4_entered.grid(column=1, row=4)
# 버튼 클릭 함수 정의 (에러 체크 까지)
def click_me() :
name_err = "T"
label.configure(text = '완료', foreground = 'blue')
if name.get() == "": # 검색어가 오류면
name_err = "F"
label.configure(text='한 글자 이상 입력하세요.', \
foreground='red')
name2_err = "T"
label2.configure(text = '완료', foreground = 'blue')
if int(name2.get()) > 1000 or int(name2.get()) < 1 : # start_point 가 오류면
name2_err = "F"
label2.configure(text = '1 ~ 1000 사이의 값을 입력해주세요.', \
foreground = 'red')
name3_err = "T"
label3.configure(text = '완료', foreground = 'blue')
if int(name3.get()) > 100 or int(name3.get()) < 10 : # display_count 가 오류면
name3_err = "F"
label3.configure(text = '10 ~ 100 사이의 값을 입력해주세요.',\
foreground = 'red')
name4_err = "T"
label4.configure(text = '완료', foreground = 'blue')
if name4.get() == "" or int(name4.get()) == 0 : # 페이지 나눌 기준 건수 가 오류면
name4_err = "F"
label4.configure(text = '0 이상의 숫자값을 입력해주세요.',\
foreground = 'red')
if name_err == "T" and name2_err == "T" and name3_err == "T" and name4_err == "T": # 오류 없으면
action.configure(text = name.get() + " 관련 블로그를 " + \
str(int(name2.get()) * int(name3.get())) + "개 크롤링 합니다.") # 버튼에 나타나는 글자
naverBlogOpenAPI_to_docx(name.get(), int(name2.get()), int(name3.get()), int(name4.get()))
else: # 하나라도 오류면
action.configure(text = "입력값 수정 후 다시 누르세요.") # 버튼에 나타나는 글자
# 버튼 추가
action = ttk.Button(srch, text = "검색을 시작합니다!", command = click_me)
action.grid(column = 1, row = 5)
# Exit GUI cleanly
def _quit():
win.quit()
win.destroy()
exit()
# Creating a Menu Bar
from tkinter import Menu
from tkinter import messagebox as msg
menu_bar = Menu(win) # 취상위 메뉴 = menu_bar
win.config(menu=menu_bar) # 최상위 메뉴 만들기
# Add menu items
file_menu = Menu(menu_bar, tearoff=0) # 최상위 메뉴 아래에 file_menu 만들기
menu_bar.add_cascade(label="File", menu=file_menu) # file_menu를 "File" 이라는 이름으로 메뉴 만들기
# .add_cascade -> 메뉴를 수직으로 정렬
file_menu.add_command(label="New") # file 메뉴에 "New" 탭 추가
file_menu.add_separator() # 메뉴 구분
file_menu.add_command(label="Exit", command=_quit) # file 메뉴에 "Exit" 탭 추가 + 명령함수 (_quit)
# Display a Message Box
def _msgBox():
msg.showinfo('Information', '멀티캠퍼스 프로젝트 (author : 이혁수)\n만든년도 2020.')
# Add another Menu to the Menu Bar and an item
help_menu = Menu(menu_bar, tearoff=0) # 최상위 메뉴 아래에 help_menu 만들기
menu_bar.add_cascade(label="Help", menu=help_menu) # help_menu를 "Help"라는 이름으로 메뉴 만들기
help_menu.add_command(label="About", command=_msgBox) # display messagebox when clicked
# Change the main windows icon 아이콘 변경
win.iconbitmap('C:/Users/student/Desktop/python/P_3week/Sonya-Swarm-Cat.ico') # ico 파일
# 실행
win.mainloop()