File size: 3,339 Bytes
62047e7
 
40404d4
 
90b5a8a
62047e7
90b5a8a
62047e7
 
 
64949c0
62047e7
 
64949c0
62047e7
90b5a8a
62047e7
 
 
 
 
 
 
 
 
 
 
90b5a8a
40404d4
7d126ce
65494ca
 
7d126ce
65494ca
7d126ce
 
 
65494ca
90b5a8a
62047e7
 
 
40404d4
 
90b5a8a
40404d4
 
 
 
7b1c6fe
40404d4
 
 
 
62047e7
 
90b5a8a
62047e7
40404d4
 
 
 
 
 
b8dd41f
 
5f960fc
90b5a8a
b8dd41f
 
 
 
 
 
 
 
5f960fc
 
b8dd41f
40404d4
62047e7
 
b8dd41f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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()