9편. 실전 자동화 5: 공공데이터포털 오픈 API로 주식 시세 데이터 가져오기 (크롤링 대신 공식 데이터)
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
지난 8편에서는 텔레그램 봇으로 원하는 정보를 휴대폰에 받아 보는 방법을 만들었습니다. 이번 9편에서는 그 알림에 담을 ‘믿을 수 있는 데이터’를 가져오는 방법을 다룹니다. 6편의 웹 크롤링은 편리하지만, 사이트 구조가 바뀌면 코드가 깨지고 사이트마다 수집 허용 범위도 달라서 조심해야 합니다. 그래서 공공기관이 공식으로 열어 둔 오픈 API를 쓰는 방법을 알아 두면 훨씬 안정적입니다.
예제로는 공공데이터포털(data.go.kr)의 금융위원회_주식시세정보 API를 사용해, 종목 이름만 넣으면 날짜별 종가·등락률·거래량을 엑셀 표로 저장하는 코드를 만들어 보겠습니다.
1. 크롤링과 오픈 API의 차이
| 구분 | 웹 크롤링 (6편) | 오픈 API (9편) |
|---|---|---|
| 데이터 출처 | 웹페이지 화면을 읽어 옴 | 기관이 제공하는 공식 데이터 |
| 안정성 | 사이트 디자인이 바뀌면 코드 수정 필요 | 정해진 형식(JSON/XML)으로 응답 |
| 허용 여부 | 사이트마다 확인 필요 | 신청 후 받은 인증키로 정식 이용 |
| 준비물 | 없음 | 회원가입 + 활용신청 + 인증키 |
2. 인증키 발급받기
- 공공데이터포털(data.go.kr)에 회원가입 후 로그인합니다.
- 검색창에 금융위원회_주식시세정보를 검색해 ‘오픈API’ 항목으로 들어갑니다.
- 활용신청 버튼을 누르고 활용 목적(예: 개인 학습)을 적어 신청합니다.
- 마이페이지의 개발계정에서 승인 상태와 일반 인증키를 확인합니다. 인증키는 Encoding과 Decoding 두 가지가 보이는데, 아래처럼 파이썬 requests의 params로 넘길 때는 Decoding 키를 쓰면 됩니다.
신청 직후에는 키가 실제로 동작하기까지 시간이 조금 걸릴 수 있습니다. 바로 오류가 나면 잠시 뒤에 다시 시도해 보세요.
3. 주식 시세 가져와서 엑셀로 저장하기
7편에서 쓴 Pandas를 그대로 활용합니다. requests와 pandas, openpyxl이 설치되어 있어야 합니다.
import requests
import pandas as pd
SERVICE_KEY = "여기에_Decoding_인증키를_넣으세요"
URL = "https://apis.data.go.kr/1160100/GetStockSecuritiesInfoService_V2/getStockPriceInfo_V2"
params = {
"serviceKey": SERVICE_KEY,
"resultType": "json", # 응답 형식 (기본값은 xml)
"numOfRows": 30, # 한 번에 받을 개수
"pageNo": 1,
"itmsNm": "삼성전자", # 종목명이 정확히 일치하는 데이터
"beginBasDt": "20261001", # 이 날짜 이후 데이터
}
res = requests.get(URL, params=params, timeout=10)
data = res.json()
items = data["response"]["body"]["items"]["item"]
if isinstance(items, dict): # 결과가 1건이면 리스트가 아닐 수 있음
items = [items]
df = pd.DataFrame(items)[["basDt", "itmsNm", "clpr", "vs", "fltRt", "trqu"]]
df.columns = ["기준일", "종목명", "종가", "전일대비", "등락률(%)", "거래량"]
df = df.sort_values("기준일")
print(df)
df.to_excel("주식시세.xlsx", index=False)
print("✅ 주식시세.xlsx 저장 완료")코드 설명
- params: 요청 조건을 사전(dict)으로 넘기면 requests가 주소 뒤에 알아서 붙여 줍니다.
itmsNm은 종목명이 정확히 같은 것,likeItmsNm은 종목명에 그 글자가 들어간 것을 찾습니다. - basDt·clpr·vs·fltRt·trqu: 각각 기준일자, 종가, 전일 대비, 등락률, 거래량입니다. 이 밖에도 시가(mkp), 고가(hipr), 저가(lopr), 시가총액(mrktTotAmt) 같은 항목이 함께 옵니다.
- isinstance(items, dict): 결과가 한 건뿐이면 목록이 아니라 사전 하나로 오는 경우가 있어, 같은 방식으로 처리하도록 맞춰 줍니다.
4. 꼭 알아 둘 점
- 실시간 데이터가 아닙니다. 이 API는 하루 한 번, 기준일 다음 영업일 오후 1시 이후에 갱신됩니다. 장중 가격 확인용이 아니라 지난 시세를 모으고 정리하는 용도로 쓰세요.
- 이용 조건을 확인하세요. 데이터마다 공공누리 유형이 정해져 있고, 이 API 안내 페이지에는 재배포 제한 조건이 적혀 있습니다. 개인 분석용으로 쓰고, 받은 데이터를 그대로 다시 공개하지 않는 것이 안전합니다.
- 인증키는 코드에 그대로 두고 공유하지 마세요. 블로그나 깃허브에 코드를 올릴 때는 키 부분을 반드시 지우세요.
5. 8편 텔레그램 봇과 연결하기
위 코드에서 마지막 줄의 결과(예: 가장 최근 날짜의 종가와 등락률)를 문자열로 만든 뒤, 8편에서 만든 텔레그램 메시지 보내기 코드에 넣으면 매일 아침 어제 종가를 휴대폰으로 받는 알림이 완성됩니다. 윈도우 ‘작업 스케줄러’에 이 파이썬 파일을 매일 아침 실행하도록 등록해 두면 사람이 손대지 않아도 매일 돌아갑니다.
한 줄 정리
크롤링이 ‘화면을 읽는 방법’이라면 오픈 API는 ‘공식 창구에서 데이터를 받는 방법’입니다. 인증키 하나만 받아 두면 같은 코드 구조로 다른 공공데이터도 똑같이 가져올 수 있습니다.
※ 이 글은 프로그래밍 학습을 위한 정보 공유이며, 특정 종목의 매수·매도를 권유하지 않습니다.
댓글
댓글 쓰기