본문 바로가기

카테고리 없음

streamlit으로 관심뉴스 크롤링, 주가조회 그래프 그리기

오늘 작성한 코드는 streamlit에서 저 두 버튼을 누르면 해당하는 기능들을 쓸 수 있는 기능을 갖고있다.

 

인터넷 찾아보면서 했다. 

 

_LOREM_IPSUM = """
이 정보는 투기하는 도박꾼들을 위한 것이 아니고, 오로지 투자자들을 위한 정보입니다. 
\n지혜롭게 소중한 부를 늘려나가시는데 큰 도움되시길!
"""


def stream_data():
    for word in _LOREM_IPSUM.split(" "):
        yield word + " "
        time.sleep(0.02)


st.write_stream(stream_data)

먼저 저 글귀들이 타이핑되듯이 업로드된다. 위 코드를 통해 저렇게 나온다. 

 

 

 

 

 

def today_main_news(url):
    response = requests.get(url, 
        headers={
        "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"})
    
    soup = BeautifulSoup(response.content, "html.parser", )

    main_news= soup.find_all("li", class_="sa_item _SECTION_HEADLINE")
    for news in main_news:
        title = news.find("strong", class_="sa_text_strong").text.strip()
        news_url = news.find("a")["href"]
        st.write(title)
        st.write(news_url)
        


url = "https://news.naver.com/section/101"
url2 = "https://news.naver.com/section/105"
if st.button("오늘의 주요 소식 보기"):
    today_main_news(url)
    today_main_news(url2)

위 오늘의 주요소식보기 기능을 구현한 코드. 

 

네이버의 뉴스기사 탭 중, section/101은 경제, 105는 it뉴스탭이다. 여기에서 헤드라인 뉴스를 골라서 보여준다. 

li태그 안에있는 해당하는 이름의 클래스를 불러서 요소를 가져온다. 

 

.text는 BeautifulSoup 안에있는 기능인데 객체 안에있는 text 추출해주고, .strip()을 통해서는 양쪽  공백을 없애준다. 

st.write를 통해서 기사 제목과 url 뽑아서 적어준다.

 

 

 

 

def get_stock_price():
    st.markdown("주식 raw_data")
    st.sidebar.title("Stock Chart")
    ticker = st.sidebar.text_input("ticker 입력(ex, NVDA)", value = "NVDA")
    st.sidebar.markdown('ticker 조회 : "https://finance.yahoo.com/"')
    start_date = st.sidebar.date_input("시작일: ", value = pd.to_datetime("2024-01-01"))
    end_date = st.sidebar.date_input("종료일: ", value = pd.to_datetime("2024-03-07"))

	#야후 파이낸스에서 조회할 종목의 가격 raw data를 가져옴.
    data = yf.download(ticker, start= start_date, end= end_date)
    #st.dataframe을 통해서 주가정보 rawdata를 숫자로 보여줌
    st.dataframe(data)
    
    #st.sidebar.radio로 사이드 바 안에 옵션추가
    chart_type = st.sidebar.radio("차트타입 선택", ("Candle_Stick", "One_Line"))
    candlestick = go.Candlestick(x=data.index, open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'])
    one_line = go.Scatter(x=data.index, y=data['Close'], mode='lines', name='Close')

    #candle stick인 경우와 line차트인 경우로 나눔.
    if chart_type == "Candle_Stick":
        figure = go.Figure(candlestick)
    elif chart_type == "One_Line":
        figure = go.Figure(one_line)
    else:
        st.error("error")

    figure.update_layout(title=f"{ticker} Stock {chart_type} Chart", xaxis_title="Date", yaxis_title="Price")
    st.plotly_chart(figure, use_container_width=True)



if st.button("관심종목 주가 조회하기"):
    get_stock_price()

요즘 가장핫한 NVIDIA를 기본 조회종목으로 넣어놨다. 변경할 수 있다. 

streamlit의 sidebar를 통해서 티커를, 조회 시작일, 종료일을 입력받는다. 

 

그리고나서 yf를 통해서 티커와 시작-종료일에 따른 주가데이터를 다운받는다. 

 

st.sidebar.radio를 통해서는 사이드바 안에 차트모양을 선택할 수 있다. 

캔들차트와 한줄짜리 둘 중하나로 선택가능. 여기서 go. << 얘는 plotly라는 라이브러리를 설치해서 썼다.

이 go 모듈을 통해서 다양한 그래프를 그릴 수 있다. 예를들어 go.Scatter는 선그래프, go.Bar로는 막대그래프 그림.

 

.update_layout을 통해 마지막으로 그래프의 레이아웃을 설정해준다. 

st.plotly_chart()로 그려줌.