import requests from bs4 import BeautifulSoup import pandas as pd import gradio as gr def fetch_kosdaq_data(): # 네이버 증권 코스닥 URL url = "https://finance.naver.com/sise/sise_rise.naver?sosok=1" try: # 웹 페이지 요청 response = requests.get(url) response.raise_for_status() soup = BeautifulSoup(response.content, "html.parser") # 테이블 데이터 추출 table = soup.find("table", class_="type_2") rows = table.find_all("tr") data = [] for row in rows: columns = row.find_all("td") if len(columns) >= 12: # 12개 열이 있는 행만 처리 try: # 데이터 파싱 rank = columns[0].get_text(strip=True) name = columns[1].get_text(strip=True) current_price = columns[2].get_text(strip=True) diff = columns[3].get_text(strip=True) change_rate = columns[4].get_text(strip=True) volume = columns[5].get_text(strip=True) buy_price = columns[6].get_text(strip=True) sell_price = columns[7].get_text(strip=True) buy_total = columns[8].get_text(strip=True) sell_total = columns[9].get_text(strip=True) per = columns[10].get_text(strip=True) roe = columns[11].get_text(strip=True) data.append([ rank, name, current_price, diff, change_rate, volume, buy_price, sell_price, buy_total, sell_total, per, roe ]) except Exception as e: print(f"Error parsing row: {e}") continue # DataFrame 생성 columns = ["Rank", "Name", "Current Price", "Difference", "Change Rate", "Volume", "Buy Price", "Sell Price", "Buy Total", "Sell Total", "PER", "ROE"] df = pd.DataFrame(data, columns=columns) return df except Exception as e: print(f"Error occurred: {e}") return None def display_data(): df = fetch_kosdaq_data() if df is not None and not df.empty: return df else: return "Failed to fetch data or no data available. Please check the logs." # Gradio 인터페이스 설정 def gradio_interface(): with gr.Blocks() as demo: gr.Markdown("# 네이버 증권 코스닥 데이터 스크래핑") fetch_button = gr.Button("데이터 가져오기") output_table = gr.Dataframe(headers=["Rank", "Name", "Current Price", "Difference", "Change Rate", "Volume", "Buy Price", "Sell Price", "Buy Total", "Sell Total", "PER", "ROE"]) # 명시적 열 이름 지정 fetch_button.click(fn=fetch_kosdaq_data, inputs=[], outputs=output_table) return demo demo = gradio_interface() if __name__ == "__main__": demo.launch()