FC
feno-canvas
Yahoo Finance 포트폴리오 긁어오기 방법론
v002
methodology

내 Yahoo Finance 포트폴리오 종목을 자동으로 긁어오는 방법

Chrome 쿠키를 증명서로 쓰고, Yahoo Finance 웹 페이지에서 보유 종목/수량/가격/현금/거래내역을 추출해 JSON 아티팩트로 만드는 절차.

type: learning family: Field Manual lane: offline signature: step-tracker
scope

이 방법론이 하는 일

하는 일
  • Yahoo Finance에 로그인된 Chrome 세션을 재사용
  • 내 포트폴리오(p_9, p_10, ...)별 보유 종목 추출
  • 티커 / 수량 / 평단 / 현재가 / 시가총액 / 손익 / 현금 / 거래내역 수집
  • JSON 아티팩트로 저장 후 holdings-data.json 갱신에 사용
안 하는 일
  • 실시간 시세 제공(yfinance는 별도 경로)
  • Yahoo 계정 비밀번호 직접 입력
  • 거래 실행(읽기 전용)
procedure

4단계 방법론

인증 확보 — Chrome 쿠키 훔쳐쓰기

스크립트가 내 맥의 Chrome 쿠키 DB를 읽어 Yahoo Finance 로그인 상태를 증명한다. 쿠키가 없거나 만료되면 끝.

필요 조건
Chrome에서 finance.yahoo.com 로그인된 상태
입력 파일
~/Library/Application Support/Google/Chrome/Default/Cookies
출력
인증된 HTTP 세션(쿠키 + User-Agent)
실패 시
NO_COOKIES 또는 AUTH_REQUIRED

포트폴리오 식별 — p_N 번호로 타겟 지정

긁어올 포트폴리오들은 Yahoo Finance 장부 p_9, p_10 같은 ID로 미리 등록돼 있다. 이 ID로 각 포트폴리오 페이지를 요청한다.

등록 예시
p_9 → ElFenomeno_CoreSatellite
p_10 → Kgs_CoreSatellite
p_11 → Sis_CoreSatellite
p_16 → ElFenomeno_VR
요청 대상
finance.yahoo.com/portfolio/{p_N}

데이터 요청 및 파싱 — TLS 사칭 + Crumb + 통합 API + SSR

Yahoo Finance는 봇 차단이 세서 일반 HTTP 클라이언트로는 403이 뜬다. curl_cffi로 Chrome의 TLS 지문을 흉내 낸 뒤, 로그인 쿠키로 crumb 토큰을 받아 통합 API와 SSR 페이지를 동시에 긁는다.

TLS 사칭
curl_cffi.requests + impersonate="chrome"로 Chrome 지문 위장
Crumb 발급
query1.finance.yahoo.com/v1/test/getcrumb 에서 crumb 토큰 획득
통합 API
query2.finance.yahoo.com/v7/finance/desktop/portfolio 하나로 보유 종목 + 현금 잔고 조회
거래내역(SSR)
finance.yahoo.com/portfolio/{p_N}/view/fv HTML에서 __NEXT_DATA__ SSR JSON 블록을 정규식으로 추출
추출 필드
ticker, shares, avg_cost, last_price, total_cost, market_value, gain_loss, cash_balance, trade history
실패 시
BAD_CRUMB, NON_200, SSR_PARSE_MISS, SCHEMA_DRIFT

아티팩트 저장 및 적용

추출 결과를 검증된 JSON으로 저장하고, holdings-data.json 갱신에 사용한다. 저장 전 스키마 버전과 포트폴리오 수를 체크한다.

중간 출력
docs/outputs/portfolios/yahoo_auto_import_review_YYYYMMDD.json
최종 적용
docs/data/holdings-data.json
검증 항목
portfolio_count, ticker 존재, 수량 numeric, 총액 mismatch 범위
data contract

입출력 사전

단계
입력
처리
출력
1. 인증
Chrome Cookies
SQLite 읽기 + curl_cffi 세션 생성
HTTP session + TLS persona
2. Crumb
session + 쿠키
query1 getcrumb 호출
crumb token
3. 식별
YAHOO_PORTFOLIOS 맵
p_N별 URL 생성
요청 URL 목록
4. 파싱
HTML + JSON API 응답
v7 desktop portfolio API + __NEXT_DATA__ 정규식
raw portfolio dict
5. 저장
raw portfolio dict
스키마 검증 + 정제
review JSON
6. 적용
review JSON
holdings-data.json 병합
갱신된 holdings
failure modes

대표 실패 패턴

코드
의미
원인
조치
NO_COOKIES
쿠키 없음
Chrome 로그아웃 / 경로 다름
Chrome에서 Yahoo 로그인 확인
BAD_CRUMB
crumb 토큰 오류
세션 만료 / 쿠키 무효 / 2FA 차단
브라우저에서 재로그인 후 crumb 재발급
NON_200
HTTP 실패
네트워크 / TLS 지문 차단 / 잘못된 p_N
curl_cffi 설치 및 impersonate='chrome' 확인
SSR_PARSE_MISS
HTML 파싱 실패
Yahoo 페이지 구조 변경
__NEXT_DATA__ 파서 업데이트 필요
SCHEMA_DRIFT
스키마 불일치
필드명/형식 변경
매핑 로직 수정
REPLAY_MISMATCH
재생 검증 실패
캐시/실제 데이터 불일치
수동 리뷰 후 재시도
takeaway

한 줄 요약

핵심

Chrome 로그인 세션을 쿠키로 빌려 Yahoo Finance 포트폴리오 페이지를 뒤지고, 보유 종목/수량/가격/현금/거래내역을 긁어서 JSON로 만든 뒤 holdings-data.json에 반영한다.

코드 진입점

scripts/yahoo_portfolio_collector.py

이 파일 하나에 인증, 요청, 파싱, 저장, 실패 모드 처리가 전부 들어 있다.