나만의 배당주 사이트 만들기) 2-1. 개발 단계 - 배당지불일, 시장별 티커리스트 구하기 feat. 웹크롤링, Yfinance, FinanceDataReader

2025. 1. 14. 13:00프로젝트

이 전 글들이 궁금하다면 ?

 

0. 사이트를 만드려는 이유

https://hsjoo126.tistory.com/80

 

1-1. 프로젝트 가능성 보기

https://hsjoo126.tistory.com/81

 

pandas 와 jupyter 이용해서 테스트해보기 

https://hsjoo126.tistory.com/82

 

1-2. 기획 단계 - 디자인, 와이어 프레임, ERD 등

https://hsjoo126.tistory.com/83

 

2. 개발 단계 - 계획짜기, 구현해보기

https://hsjoo126.tistory.com/84

 


 

아마 이번 글은 이전 글을 보고와야 이해가 될 것이다!

아무튼!

 

 

3-1. 배당날짜 다시보기!

 

계속 조사하면서 깨달은 건데, 내가 전 글에서 구했던 배당금 날짜는 배당락일이라는 사실을 알아냈다...!

난 배당 지불일을... 알고 싶었던 건데 , 음 

 

  • 배당락일은 주식을 당장 사려는 사람들한테 중요할 거 같고 (초보자, 단기 투자자)
  • 배당 지불일은 장기 투자자나 계획을 세우려는 사람에게 중요할 거 같다

 

배당락일은 yfinance에서 바로 뽑아낼 수 있으니,

배당 지불일을 어떻게 구하는지 찾아봐야겠다.

 

...

 

음... 찾아봤는데 yfinance에선 제공해주지 않고, 다른 곳에선 유료로 해야한다. 

웹크롤링을 해야하나 ........ 아~~~~

 

아무튼 다시 돌아와서 ... 무료 라이브러리들론 구할 수 없을 거 같고

다른 방법으로는 

 

1. 유료 API 사용하기 

2. 웹크롤링 해서 주기적으로 업데이트 하기 

3. 그냥 주식 사이트 던져주고 알아서 보라고 하기..? ㅋㅋㅋㅋㅋㅋ

 

사실 이전 글에서도 언급했던 방법임 엉엉 ㅜㅜ

내가 주기적으로 볼 거여서... 1번은 어려울 거 같고(수익창출이 되는 것도 아니니까 ㅜ)

3번은 최후의 방법으로 두고,

웹크롤링 하는 건 도전해볼 수 있을 거 같다.

 

 

예상으로는 

웹크롤링 하고 셀러리를 사용해 홈페이지에 주기적으로 업데이트 해주는 식이면 될 거 같다.

 

이 사이트를 참고 해서 해보자!

https://www.octoparse.kr/blog/how-to-scrape-yahoo-finance

 

야후 파이낸스 크롤링 가이드 | Octoparse

야후 파이낸스에서 주식, 지수 펀드, 환율, 채권, 상품 등 다양한 금융 상품에 대한 실시간 및 과거 데이터 쉽고 빠르게 추출할 수 있는 훌륭한 야후 파이낸스 스크래퍼를 소개합니다.

www.octoparse.kr

 

 

웹크롤링 도저어언!!!

사이트에 보니 크롤링은 Beautiful Soup 이라는 라이브러리를 사용해서 할 수 있다고 한다.

 

1. 설치

먼저, 크롤링에 필요한 걸 설치해주자

pip install bs4

 

2. 크롤링이 가능한 사이트인지 테스트 해보기!

네이버링크를 넣어서 테스트 해봤다!

import yfinance as yf
import pandas as pd
import requests
from bs4 import BeautifulSoup
# 크롤링 테스트
#get the URL using response variable
my_url = "https://www.naver.com/"
response = requests.get(my_url)

#Catching Exceptions
print("response.ok : {} , response.status_code : {}".format(response.ok , response.status_code))
print("Preview of response.text : ", response.text[:500])

 

결과 코드~

response.ok : True , response.status_code : 200
Preview of response.text :     <!doctype html> <html lang="ko" class="fzoom"> <head> <meta charset="utf-8"> <meta name="Referrer" content="origin"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=1190"> <title>NAVER</title> <meta name="apple-mobile-web-app-title" content="NAVER"/> <meta name="robots" content="index,nofollow"/> <meta name="description" content="네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요"/> <meta property="og:title" content="네이버"> <meta property="og:url" content="https://www.

 

오! 네이버는 잘 크롤링 되는 거 같다~

 

investing.com 은 false 가 떴고

#investing.com
response.ok : False , response.status_code : 403
Preview of response.text :  <!DOCTYPE html><html lang="en-US"><head><title>Just a moment...</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><meta name="robots" content="noindex,nofollow"><meta name="viewport" content="width=device-width,initial-scale=1"><style>*{box-sizing:border-box;margin:0;padding:0}html{line-height:1.15;-webkit-text-size-adjust:100%;color:#313131;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetic

 

dividend.com은 true가 떴다!

#dividend.com
response.ok : True , response.status_code : 200
Preview of response.text :  <!DOCTYPE html>
<html>
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-M8D9SMCZ');</script>
<!-- End Google Tag Manager -->

<link rel="alternate" type="application/rss+xml"

 

dividend.com 으로 한 번 해봐야겠다.

 

3. 크롤링 코드 짜보기~ 

나는 파란 박스를 크롤링 해오고 싶다.

 

GPT 슨생님의 도움을 받아서 코드를 짜봤는데 ... 

import requests
from bs4 import BeautifulSoup

# URL 정의
url = "https://www.dividend.com/stocks/technology/apple-inc-aapl-dividends/"  # 크롤링할 실제 URL

# HTML 요청 및 파싱
response = requests.get(url)
if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')

    # 파란 박스 부분 선택 (class 이름으로)
    blue_box = soup.find('div', {'class': 't-flex t-flex-col md:t-h-52 xl:t-h-42'})

    if blue_box:
        # 박스 안의 텍스트 추출
        print(blue_box.text.strip())
    else:
        print("파란 박스 영역을 찾을 수 없습니다.")
else:
    print(f"페이지 요청 실패: {response.status_code}")

 

결과 코드

×







Payout Estimation Logic


Estimates are provided for securities with at least 5 consecutive payouts, special dividends not included. For ETFs and Mutual Funds, return of capital and capital gains distributions are not included.


If the last five payouts show limited variability, we estimate future payouts equal to the most recent one.
If the last five payouts show variability and are all growing, we estimate future payouts by applying the average growth rate to the most recent payout.
 If the last five payouts show variability and are not all growing, we estimate future payouts by applying the lowest growth rate (negative growth rates included) to the most recent payment.

크흡... 뜨지 않는다...!!

 

다른 부분은 크롤링이 잘 되는 거 같은데, 내가 원하는 부분만 크롤링이 안 되는 거 같다 ...

엉엉 ㅜㅜ

 

이 두 가지 조건을 가진 사이트를 찾는 게 이리 어려울 일이었나 ... ? ㅎ...

  • 크롤링이 가능한 사이트
  • 배당 지불일이 기록되어 있는 사이트

내가 실패한 것과는 별개로 크롤링 코드는 잘 작동 되니 원하는 사람들은 갖다 쓰도록하자!


 

3-2. 하... 나 뭐한 거니

ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 하하하하하하핳ㅎ하하핳

아 .... 현타 ... 

 

내가 오늘 하루조오옹일 배당지불일 관련해서 열심히 찾았는데 ...

문득 찾다가 

 

"그러고보니까 yfinance에 캘린더 함수가 있지 않나?"

라는 생각이 들어버림...

 

그리고 바로 적용해보니까?

#주식의 일정? 구하는 함수
ticker = yf.Ticker("AAPL")
info = ticker.calendar
df = pd.DataFrame(info)

print(df)

 

 

결과가 이렇게 떴는데

#결과값
Dividend Date Ex-Dividend Date Earnings Date  Earnings High  Earnings Low  Earnings Average  Revenue High   Revenue Low  Revenue Average
0    2024-11-14       2024-11-08    2025-01-31            2.5          2.19           2.35371  129887000000  119563000000     124217662300

아니!!!! 내가 그렇게!!! 찾던!!!! 배당 지불일이잖아 ??????????/

 

진심 이마탁...

 

여태까지 뭐한 거임 나 ? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

GPT 슨생님 시켜서... 배당지불일 구하는 코드도 바로 써벌임...

#배당지불일 구하는 코드
import yfinance as yf
import pandas as pd

# 특정 주식의 티커 정보 가져오기
ticker = yf.Ticker("AAPL")

# 캘린더 정보 가져오기
info = ticker.calendar

# DataFrame으로 변환
df = pd.DataFrame(info)

# 'Dividend Date' 열만 추출
dividend_date = df['Dividend Date']

# 'Dividend Date'의 첫 번째 값 가져오기
dividend_date_value = dividend_date.iloc[0]

# 결과 출력
print("Dividend Date:", dividend_date_value)
#결과값
Dividend Date: 2024-11-14

 

 

ㅠㅠㅠㅠ yfinance ... 의심해서 미안해 ..

내 눈에 안 보이길래.. 없는 기능인줄 알았ㅈ지,,,,

내 멍청함에 이마를 탁! 치고...

 

그래도 웹크롤링 배웠으니까,, 됐다 .... 하핳ㅎㅎ

 

 

calendar 을 봤던 ... 참고 사이트

https://zoo.cs.yale.edu/classes/cs458/lectures/yfinance.html

 

yfinance

Security Analysis¶ Many Wall Street firms, like Morgan Stanley, Goldman Sachs, and Merrill Lynch, employ finance professionals who advise investors which stocks to buy and sell. For example, see a recent Merrill Lynch report on Apple (AAPL). An analysis w

zoo.cs.yale.edu


4. 티커리스트 구하기

 

이런거 저런거 조사하다가 yfinance처럼 잘되어있는 라이브러리를 찾기도 했다.

이 라이브러리는 해외 뿐만 아니라 국내 데이터도 다 가지고 있다. 

https://github.com/FinanceData/FinanceDataReader?tab=readme-ov-file

 

GitHub - FinanceData/FinanceDataReader: Financial data reader

Financial data reader. Contribute to FinanceData/FinanceDataReader development by creating an account on GitHub.

github.com

 

 

 

그리고 이 라이브러리에선 특정 거래소의 상장된 주식 정보를 모두 가져올 수 있다고 한다! 

내가 실패했던 티커리스트 구하기가 이 라이브러리를 쓰면 해결될거 같은 느낌이 든다 ...! 

https://digitalbourgeois.tistory.com/268

 

주식 데이터를 손쉽게 가져오는 방법! FinanceDataReader 파이썬 모듈 완벽 가이드

주식 데이터를 수집하고 분석하는 것은 금융 및 투자 분야에서 매우 중요한 작업입니다. 이를 위해 다양한 툴과 라이브러리가 존재하지만, 그 중에서도 FinanceDataReader는 특히 국내외 주식 데이터

digitalbourgeois.tistory.com

 

 

4-1. FinanceDataReader 사용해서 티커리스트 구하기!

일단 pip 를 설치해주자!

#라이브러리 설치
pip install finance-datareader

#얘한테 의존하고 있다고 해서 얘도 설치해줘야됨.
pip install plotly

원랜 finance~~ 라이브러리만 설치해서 돌렸는데

이런 에러가 떠서 plotly도 같이 설치해줬다!

ModuleNotFoundError: --------------------------------------------------------------------------------
    FinanceDataReade.chart.plot() dependen on plotly
    plotly not installed please install as follows

    pip install plotly

    FinanceDataReade.chart.plot()는 plotly에 의존성이 있습니다.
    명령창에서 다음과 같이 plotly를 설치하세요

    pip install plotly

 

 

자 그리고 나스닥에 있는 주식 정보들을 쭉 불러와보자!

import FinanceDataReader as fdr
import pandas as pd

nasdaq_stocks = fdr.StockListing('NASDAQ')

print(nasdaq_stocks.head())
print(f"총 {len(nasdaq_stocks)}개의 주식 정보가 있습니다.")
#결과값
Symbol                Name IndustryCode    Industry
0   AAPL           Apple Inc     57106020  전화 및 소형 장치
1   NVDA         NVIDIA Corp     57101010         반도체
2   MSFT      Microsoft Corp     57201020       소프트웨어
3   AMZN      Amazon.com Inc     53402010         백화점
4   META  Meta Platforms Inc     57201030     온라인 서비스
총 3640개의 주식 정보가 있습니다.

 

오 잘 나온다!! 이 중에서 티커들만 뽑아보자!

#티커 리스트 뽑는 코드

import FinanceDataReader as fdr

# 나스닥(NASDAQ) 주식 정보 가져오기
nasdaq_stocks = fdr.StockListing('NASDAQ')

# Symbol 열만 추출
symbols = nasdaq_stocks['Symbol']

# 데이터 확인
print(symbols.head())  # 상위 5개 데이터 출력
print(f"총 {len(symbols)}개의 심볼이 있습니다.")
#결과값
0    AAPL
1    NVDA
2    MSFT
3    AMZN
4    META
Name: Symbol, dtype: object
총 3640개의 심볼이 있습니다.

오오오오 잘나왔어~~

 

안 될 것처럼 보였던 티커 리스트도 구했으니! 

이쯤에서 내가 구현해야할 목록을 다시보자!

구현해야할 목록

  • 티커리스트 
  • 현재 주가 (웹소켓 써야 함 ㅜ)
  • 마지막 배당금
  • 마지막 배당일
  • 배당률
  • 시총

 

와!! 그래도 예상보단 빨리 구현한 것 같다.

시총은 yfinance에서 쉽게 구할 수 있으므로 다음 글에서 한 번에 정리 해보겠다!