SUHHHH's picture
Update app.py
7b1c6fe verified
import requests
from bs4 import BeautifulSoup
import pandas as pd
from io import BytesIO
import gradio as gr
# 넀이버 증ꢌ μƒμŠΉ μ’…λͺ© μŠ€ν¬λž˜ν•‘ ν•¨μˆ˜
def scrape_naver_stock():
url = "https://finance.naver.com/sise/sise_rise.naver?sosok=1"
response = requests.get(url)
response.encoding = 'euc-kr' # λ„€μ΄λ²„λŠ” euc-kr 인코딩 μ‚¬μš©
soup = BeautifulSoup(response.text, 'html.parser')
# ν…Œμ΄λΈ”μ—μ„œ 데이터 μΆ”μΆœ
table = soup.find('table', class_='type_2')
rows = table.find_all('tr')
stock_data = []
for row in rows:
cols = row.find_all('td')
if len(cols) > 1: # μ‹€μ œ 데이터가 μžˆλŠ” ν–‰λ§Œ 처리
rank = cols[0].text.strip() # μˆœμœ„
name = cols[1].text.strip() # μ’…λͺ©λͺ…
current_price = cols[2].text.strip() # ν˜„μž¬κ°€
change_price = cols[3].text.strip() # 전일비
change_rate = cols[4].text.strip() # 등락λ₯ 
volume = cols[5].text.strip() # κ±°λž˜λŸ‰
# μƒμŠΉ, ν•˜λ½, μƒν•œκ°€λ₯Ό κ΅¬λΆ„ν•˜μ—¬ ν™”μ‚΄ν‘œ 이λͺ¨μ§€ μΆ”κ°€
if '+' in change_rate:
if '30.00%' in change_rate:
change_rate = 'πŸ”Ί ' + change_rate # μƒν•œκ°€
else:
change_rate = 'πŸ”΄β¬† ' + change_rate # μƒμŠΉ
elif '-' in change_rate:
change_rate = 'πŸ”΅β¬‡ ' + change_rate # ν•˜λ½
stock_data.append([rank, name, current_price, change_price, change_rate, volume])
return stock_data
# λ°μ΄ν„°ν”„λ ˆμž„μ„ μ—‘μ…€ 파일둜 λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜
def save_to_excel(stock_data):
df = pd.DataFrame(stock_data, columns=["μˆœμœ„", "μ’…λͺ©λͺ…", "ν˜„μž¬κ°€", "전일비", "등락λ₯ ", "κ±°λž˜λŸ‰"])
output = BytesIO()
writer = pd.ExcelWriter(output, engine='openpyxl')
df.to_excel(writer, index=False, sheet_name='넀이버 증ꢌ μƒμŠΉ μ’…λͺ©')
writer.save()
writer.close() # μ—‘μ…€ 파일 μ €μž₯ ν›„ writerλ₯Ό λ‹«μŒ
output.seek(0)
return output
# Gradio μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 데이터λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
def display_stocks():
stock_data = scrape_naver_stock()
return pd.DataFrame(stock_data, columns=["μˆœμœ„", "μ’…λͺ©λͺ…", "ν˜„μž¬κ°€", "전일비", "등락λ₯ ", "κ±°λž˜λŸ‰"])
# μ—‘μ…€ 파일둜 λ³€ν™˜ 및 λ‹€μš΄λ‘œλ“œλ₯Ό μ œκ³΅ν•˜λŠ” ν•¨μˆ˜
def download_excel():
stock_data = scrape_naver_stock()
excel_file = save_to_excel(stock_data)
return excel_file
# Gradio Blocks λ‚΄μ—μ„œ UI 및 이벀트 μ„€μ •
with gr.Blocks() as app:
# μƒμŠΉ μ’…λͺ©μ„ ν‘œμ‹œν•  DataFrame μ»΄ν¬λ„ŒνŠΈ
stock_table = gr.DataFrame(label="넀이버 증ꢌ μƒμŠΉ TOP μ’…λͺ©", headers=["μˆœμœ„", "μ’…λͺ©λͺ…", "ν˜„μž¬κ°€", "전일비", "등락λ₯ ", "κ±°λž˜λŸ‰"])
# μ—‘μ…€ λ‹€μš΄λ‘œλ“œ λ²„νŠΌ
download_button = gr.Button("μ—‘μ…€λ‘œ λ‹€μš΄λ‘œλ“œ")
# μ—‘μ…€ 파일 λ‹€μš΄λ‘œλ“œλ₯Ό μœ„ν•œ 파일 μ»΄ν¬λ„ŒνŠΈ
download_file = gr.File(label="μ—‘μ…€ 파일 λ‹€μš΄λ‘œλ“œ")
# λ²„νŠΌ 클릭 μ‹œ 이벀트 μ—°κ²°
stock_button = gr.Button("μ’…λͺ© 데이터 μ—…λ°μ΄νŠΈ")
stock_button.click(fn=display_stocks, inputs=None, outputs=stock_table)
download_button.click(fn=download_excel, inputs=None, outputs=download_file)
# μ‹€ν–‰
if __name__ == "__main__":
app.launch()