최근 금융 데이터 수집을 자동화하려는 많은 개발자들이 yfinance를 활용해 Yahoo Finance API에서 데이터를 가져오고 있다. 그러나 2025년 4월 말부터 갑작스럽게 429 Too Many Requests
오류가 빈번하게 발생하고 있다. 본 포스팅에서는 이 오류의 원인 분석부터 해결 방법까지, 실전 코드와 함께 상세히 정리해보겠다.
🛑 문제 현상: 429 오류의 정체는?
❗ 에러 메시지
YFRateLimitError('Too Many Requests. Rate limited. Try after a while.')
- 위 메시지는 Yahoo Finance API에서 너무 많은 요청이 들어오거나, Python의
requests
모듈을 통한 접근을 제한했을 때 발생한다. - 심지어 동일 코드를 웹 브라우저에서는 정상 작동하지만, Python에서는 차단되는 현상도 있다.
🧠 원인 분석: Yahoo의 TLS Fingerprinting
Yahoo는 최근부터 단순히 User-Agent
만 변경해서는 우회할 수 없도록, TLS Fingerprinting이라는 고급 보안 방식을 도입했다. 이로 인해 브라우저가 아닌 Python의 requests
로 접근 시 서버에서 비정상 요청으로 간주하고 차단하는 것이다.
이제는 단순한 헤더 조작만으로는 부족하다. 브라우저 수준의 TLS 설정을 흉내낼 수 있는 도구가 필요하다.
✅ 해결법: curl_cffi
를 이용한 TLS 우회
🔧 필요한 패키지 설치
pip install curl_cffi
pip install --upgrade yfinance
curl_cffi
는 브라우저처럼 TLS 요청을 흉내낼 수 있도록 도와주는 Python 라이브러리다.
🧪 실전 코드 예시: 세션 주입 방식
📌 yfinance + curl_cffi 통합 사용
from curl_cffi import requests
import yfinance as yf
# 브라우저(TLS) 환경을 흉내내는 세션 생성
session = requests.Session(impersonate="chrome")
# 세션을 yfinance 객체에 직접 주입
ticker = yf.Ticker("AAPL", session=session)
data = ticker.history(period="1mo")
print(data)
impersonate="chrome"
옵션으로 크롬 브라우저처럼 동작session
파라미터를 통해 yfinance가 Yahoo API에 접속할 때 해당 TLS 세션을 사용
✅ 결과
429 오류 없이 정상적으로 가격 데이터 다운로드 성공!
📥 yf.download()
함수에서도 적용 가능
다수의 티커 데이터를 다운로드할 때도 아래와 같이 세션을 활용할 수 있다:
data = yf.download("MSFT AAPL TSLA", session=session, period="1mo")
print(data.head())
🐍 Anaconda 사용자라면?
일부 사용자는 Anaconda 환경에서 curl_cffi
가 잘 설치되지 않는 문제를 겪을 수 있다. 이럴 경우에도 pip
로 설치가 가능하다:
conda activate your_env_name
pip install curl_cffi
💬 커뮤니티 요약
- Github 이슈 #2422에서 이 문제에 대해 많은 토론이 있었으며,
curl_cffi
를 도입한 방식이 현재로서는 가장 효과적인 해결책이다.- 향후 yfinance 라이브러리의 업데이트로 내부적으로
curl_cffi
가 자동 적용될 수도 있지만, 지금 당장은 수동으로 세션을 주입하는 것이 가장 안정적이다.
🧩 정리
항목 | 설명 |
---|---|
오류명 | 429 Too Many Requests |
원인 | Yahoo의 TLS 검열 강화로 Python requests 차단 |
해결책 | curl_cffi 사용하여 브라우저 환경을 흉내냄 |
적용방법 | session=requests.Session(impersonate="chrome") |
사용예 | yf.Ticker("AAPL", session=session) 혹은 yf.download(..., session=session) |
✨ 마무리
Yahoo Finance API는 무료로 접근 가능한 데이터 소스지만, 이제는 브라우저 외부의 접근을 점점 더 제한하고 있다.
단순히 User-Agent
만 바꾸는 방식은 더 이상 통하지 않는다.
curl_cffi를 활용한 세션 주입 방식은 현시점에서 가장 확실하고 실용적인 해결책이다.
데이터 수집 자동화를 하고 있다면, 지금 바로 적용해보자.
'Programming' 카테고리의 다른 글
💾 SQL Server 메모리 과점유 문제 해결 및 진단 가이드 (1) | 2025.05.28 |
---|---|
📊 Twelve Data API 완벽 가이드 – 실시간 금융 데이터 가져오기 (4) | 2025.05.10 |
🛠️ 야후 파이낸스 API 429 오류(Too Many Requests) 대응법 총정리 (1) | 2025.05.08 |
🧠 진짜 쉽게 배우는 Python 함수형 프로그래밍: lambda, map, filter, reduce (0) | 2025.03.31 |
📡 Python으로 MSSQL 저장 프로시저 실행하기 (파라미터 전달까지 완벽 정리!) (0) | 2025.03.28 |