import os import requests from bs4 import BeautifulSoup import pandas as pd import re import gradio as gr from openpyxl import load_workbook from openpyxl.styles import Font # 네이버 증권 URL url = "https://finance.naver.com/sise/sise_rise.naver?sosok=1" # 스크래핑 함수 def scrape_naver_finance(): # 페이지 요청 response = requests.get(url) response.encoding = 'euc-kr' # 한글 인코딩 설정 html = response.text # BeautifulSoup을 사용하여 HTML 파싱 soup = BeautifulSoup(html, 'html.parser') # 테이블 찾기 table = soup.find("table", {"class": "type_2"}) # 데이터를 저장할 리스트 data = [] # 테이블의 모든 행(tr) 가져오기 rows = table.find_all("tr")[2:] # 첫 번째 행은 제목, 두 번째는 빈칸이므로 제외 for row in rows: columns = row.find_all("td") if len(columns) > 1: rank = columns[0].text.strip() name = columns[1].text.strip() price = columns[2].text.strip() change = columns[3].text.strip() rate = columns[4].text.strip() volume = columns[5].text.strip() # '상한가', '상승' 등의 글씨 제거 change_cleaned = re.sub(r'[^\d-]', '', change).strip() rate_cleaned = re.sub(r'[^\d.-]', '', rate).strip() # 각 열의 데이터를 리스트로 저장 data.append([rank, name, price, change_cleaned, rate_cleaned, volume]) # DataFrame으로 변환 df = pd.DataFrame(data, columns=["순위", "종목명", "현재가", "전일비", "등락률", "거래량"]) # 저장할 디렉터리 생성 (필요한 경우) save_dir = "/mnt/data" if not os.path.exists(save_dir): os.makedirs(save_dir) # 엑셀 파일로 저장 save_path = os.path.join(save_dir, "naver_top_stocks.xlsx") df.to_excel(save_path, index=False) # 엑셀 파일에 스타일 추가 (상승률이 20% 이상이면 종목명을 빨간색으로 표시) workbook = load_workbook(save_path) sheet = workbook.active red_font = Font(color="FF0000") # 빨간색 글씨체 설정 for row in range(2, sheet.max_row + 1): rate_value = sheet.cell(row=row, column=5).value if rate_value and float(rate_value) >= 20.0: sheet.cell(row=row, column=2).font = red_font # 종목명 컬럼을 빨간색으로 설정 workbook.save(save_path) return df, save_path # Gradio 인터페이스 정의 (화면 표시 및 파일 다운로드 링크 제공) def get_top_stocks(): df, file_path = scrape_naver_finance() return df, file_path # Gradio 인터페이스 생성 (DataFrame과 파일 다운로드 제공) iface = gr.Interface(fn=get_top_stocks, inputs=None, outputs=["dataframe", "file"], title="네이버 증권 상승 TOP 종목") iface.launch()