AIOT - bs4와 tkinter를 활용한 주식 현재가 출력하기
오늘은 파이썬의 BeautifulSoup와 tkinter를 이용해 관심있는 주식 종목의 현재가를 버튼 위젯을 눌러 출력하는 프로그램을 만들어보겠습니다.
1. bs4를 이용해 관심있는 주식 종목의 현재가 출력하기
# 내가 고른 종목의 현재 가격 가져와보기
#<strong class="tah p11" id="_nowVal">108,300</strong>
import requests
# bs4 모듈에 포함된 BeautifulSoup 클래스를 가져오겠다
from bs4 import BeautifulSoup
response = requests.get("https://finance.naver.com/item/sise.naver?code=028260")
html_code = response.text
# 가져온 html 코드를 해석하여 객체 형태로 얻기
soup = BeautifulSoup(html_code, "html.parser")
# 구조가 정리된 soup를 대상으로 데이터 추출
stock = soup.select_one("#_nowVal")
# print(stock.text) # 태그 벗겨내고 내용만 보기
print("삼성물산의 가격은 {}원".format(stock.text))
<실행 결과> |
삼성물산의 가격은 107400원 |
맨 위 주석문은 네이버 증권페이지에서 관심종목의 현재가 html 코드를 가져온 것입니다.
이후 가져온 html코드를 해석하여 객체 형태로 얻는 soup를 선언하고, 구조가 정리된 soup를 대상으로 데이터를 추출합니다. 현재가를 가져오기 위해 _nowVal을 인자로 사용했습니다.
2. tkinter를 이용해 버튼 위젯 만들기
import tkinter
import tkinter.font
window = tkinter.Tk() # tkinter의 Tk()클래스를 통해 윈도우 객체 생성
window.title("저선장의 GUI 프로그램")
window.geometry("400x400") # 너비와 높이를 픽셀단위로 입력
window.resizable(False, False) # 위젯 크기와 상관없이 윈도우 크기 유지
#글씨 크기 설정
font1 = tkinter.font.Font(size = 32)
font2 = tkinter.font.Font(size = 20)
# 위젯 만들기
label = tkinter.Label(window, text="관심 종목 현재가", font=font1)
label.pack() # 들어갈 곳에 들어간다!
# 버튼 만들기
button = tkinter.Button(window, text="삼성물산", font=font2)
button.pack()
# GUI 프로그램이 계속해서 실행되도록 하기
window.mainloop()
아무런 기능이 없는 간단한 버튼 위젯을 만드는 코드입니다.
이제 두가지 코드를 활용해서 3개의 관심종목을 담고, 3개의 버튼을 만들어 각각 해당 종목의 현재가를 출력하는 프로그램을 만들어 보겠습니다.
3. 주식 종목 현재가 버튼 위젯 만들기
import tkinter
import tkinter.font
import requests
from bs4 import BeautifulSoup
# 삼성물산
response1 = requests.get("https://finance.naver.com/item/sise.naver?code=028260")
html_code1 = response1.text
soup1 = BeautifulSoup(html_code1, "html.parser")
stock1 = soup1.select_one("#_nowVal")
# 삼성전자
response2 = requests.get("https://finance.naver.com/item/sise.naver?code=005930")
html_code2 = response2.text
soup2 = BeautifulSoup(html_code2, "html.parser")
stock2 = soup2.select_one("#_nowVal")
# 삼성전자우
response3 = requests.get("https://finance.naver.com/item/sise.naver?code=005935")
html_code3 = response3.text
soup3 = BeautifulSoup(html_code3, "html.parser")
stock3 = soup3.select_one("#_nowVal")
# 버튼 함수
def nowVal_button1():
label = tkinter.Label(frame1, text=("삼성물산 현재가 : {}".format(str(stock1.text))), font=font3)
label.pack()
def nowVal_button2():
label = tkinter.Label(frame2, text=("삼성전자 현재가 : {}".format(str(stock2.text))), font=font3)
label.pack()
def nowVal_button3():
label = tkinter.Label(frame3, text=("삼성전자우 현재가 : {}".format(str(stock3.text))), font=font3)
label.pack()
window = tkinter.Tk() # tkinter의 Tk()클래스를 통해 윈도우 객체 생성
window.title("저선장의 GUI 프로그램")
window.geometry("800x800") # 너비와 높이를 픽셀단위로 입력
window.resizable(False, False)
# 윈도우 구역 나누기(프레임 위젯)
frame1 = tkinter.Frame(width = 100, height = 100)
frame2 = tkinter.Frame(width = 100, height = 100)
frame3 = tkinter.Frame(width = 100, height = 100)
# 프레임 위젯 위치 설정
frame1.place(x=100, y=100)
frame2.place(x=300, y=100)
frame3.place(x=500, y=100)
#글씨 크기 설정
font1 = tkinter.font.Font(size = 20)
font2 = tkinter.font.Font(size = 15)
font3 = tkinter.font.Font(size = 10)
# 위젯 만들기
label = tkinter.Label(window, text="관심 종목 현재가", font=font1)
label.pack() # 들어갈 곳에 들어간다!
# 버튼 만들기
button1 = tkinter.Button(frame1, overrelief="solid", text="삼성물산", font=font2, width=15, command=nowVal_button1, repeatdelay=1000, repeatinterval=100)
button1.pack()
button2 = tkinter.Button(frame2, overrelief="solid", text="삼성전자", font=font2, width=15, command=nowVal_button2, repeatdelay=1000, repeatinterval=100)
button2.pack()
button3 = tkinter.Button(frame3, overrelief="solid", text="삼성전자우", font=font2, width=15, command=nowVal_button3, repeatdelay=1000, repeatinterval=100)
button3.pack()
# GUI 프로그램이 계속해서 실행되도록 하기
window.mainloop()
1번, 2번 코드를 합친 뒤 종목 세개의 현재가를 받아오고, 각각 버튼 함수를 만들어 커맨드에 각각의 버튼 함수를 넣어줬습니다. 생각보다 매우 간단한데요, 실행해 보면 각각의 종목 버튼이 세로로 만들어지고 현재가가 한줄로 출력이 됩니다.
따라서 각각의 종목 버튼과 현재가 출력의 구역을 나누기 위해 Frame 위젯을 사용해줬습니다. 구역을 적절히 나눠주면
위와 같은 창이 만들어집니다.
이외에도 tkinter 패키지에는다양한 기능이있으니 위 코드에 추가해보면 좋을 것 같습니다.
저는 출력문이 창을 넘어서까지 출력되면 내용이 잘리는 문제를 해결하기 위해 스크롤을 추가해 보려했는데..실패했네요
좀 더 공부해서 추후에 스크롤바를 추가해 보도록 하겠습니다.