본문 바로가기

개발 노트/Etc.

[API] 네이버 Finance 주식 시세 가져오기

반응형

개요

주식의 일별, 주별, 월별 가격을 얻기 위해서는 다양한 방법들이 존재한다. 키움증권 등의 증권사에서 제공하는 API 를 사용하거나, google, 야후, 네이버 등에서 제공하는 주식 정보들을 크롤링 해서 얻는 방법 등이 있다.

과거 네이버 Finance 에서는 Flash 로 차트 정보를 제공을 하여 일별 주식 정보를 얻기 어려웠는데 현재는 Web 으로 차트를 제공하다보니 주식 정보를 가져오기 쉽게 되었다.

 

참고로 보통 이러한 포털 사이트에서 제공하는 주식정보는 증권사처럼 API 형태로 제공하지 않고 사용자가 브라우저로 보는 목적만을 위해 만들어졌기 때문에 아래 설명하는 방법으로 과하게 트래픽을 발생시키거나 하면 운영단에서 호출하는 IP 를 차단하는 등의 조치를 할 수 있기에 주의해야 한다.

 

 

브라우저 개발자 도구 확인

보통 웹 서버에서 정보를 보여줄 때 직접적인 API 형태로 가이드를 하거나 제공하진 않지만 FE 개발자들과 BE 개발자들이 분리되어 있거나 해당 방식으로 개발하는 경우 Front 단에서 서버에 ajax 방식으로 호출하여 json 형태로 데이터를 주고받는 것을 브라우저에서 확인할 수 있다.

아래 예시 이미지는 Safari 이지만 Chrome 에도 거의 동일한 UI 로 제공되므로 어느 브라우저에서나 확인할 수 있다.

 

우선 우리나라의 국가적 대장주인 삼성전자를 네이버 Finance 에서 확인한다.

 

1. 네이버 Finance 에서 삼성전자 검색

링크 : https://finance.naver.com/item/main.nhn?code=005930 

 

2. 브라우저 개발자 도구를 열어 상단 메뉴의 [네트워크 > XHR] 을 선택한다.

 

3. 차트 메뉴를 클릭하여 개발자 도구 데이터 확인

XHR 선택시 좌측에 보이는 이름 리스트에 주식"시세" 정보를 가지고 있을 것 같이 보이는 siseJson.naver 를 눌러보면 좌측 미리보기 란에 실제 서버에서 브라우저에 응답한 정보가 보인다.

해당 데이터를 보면 2D array 형태로 첫번째 array 데이터는 column 의 이름 (의미)를 의미하고 그 다음부터 나오는 array 들은 각각의 날짜별 데이터로 보인다.

 

4. 헤더 메뉴를 클릭하여 실제 브라우저에서 요청한 URL 정보를 확인한다.

개발자 도구의 "헤더"를 클릭하면 브라우저에서 서버에 요청한 Request 와 실제 서버에서 응답한 Response 모두를 확인할 수 있다. (스크롤로 내리면 확인 가능)

우리가 여기서 알고 싶은건 Request 정보이고 요청 URL은 다음과 같다.

https://api.finance.naver.com/siseJson.naver?symbol=005930&requestType=1&startTime=20140817&endTime=20210605&timeframe=week

해당 URL 은 https://api.finance.naver.com/siseJson.naver 의 URI 에 GET 방식으로 Parameter 들을 서버에 요청하여 정보를 얻고 있다. 

현재 확인 가능한 Parameter 들은 대략 다음과 같다.

symbol: 005930 # 종목코드
requestType: 1 # ?
startTime: 20140817 # 시세 시작 Date
endTime: 20210605 # 시세 종료 Date
timeframe: week # 시세 단위

requestType 은 무얼 의미하는지 모르겠지만 나머지 정보들은 대략 유추가 가능하다.

timeframe 을 day 로 바꾸면 서버 응답은 일별 시세를 줄 것이고, month 로 바꾸면 월별 시세를 줄 것이다.

 

이를 이용해 python 에 주식 시세 정보를 요청하는 함수를 작성해 본다.

 

Python 함수

소스코드

from urllib import parse
from ast import literal_eval
import requests

def get_sise(code, start_time, end_time, time_from='day') :
    get_param = {
    	'symbol':code,
	    'requestType':1,
	    'startTime':start_time,
	    'endTime':end_time,
	    'timeframe':time_from
    }
    get_param = parse.urlencode(get_param)
    url="https://api.finance.naver.com/siseJson.naver?%s"%(get_param)
    response = requests.get(url)
    return literal_eval(response.text.strip())
    
get_sise('005930', '20210601', '20210605', 'day')

응답

[['날짜', '시가', '고가', '저가', '종가', '거래량', '외국인소진율'], ['20210601', 80500, 81300, 80100, 80600, 14058401, 53.69], ['20210602', 80400, 81400, 80300, 80800, 16414644, 53.73], ['20210603', 81300, 83000, 81100, 82800, 29546007, 53.82], ['20210604', 82700, 82700, 81500, 82200, 18055979, 53.82]]

 

위 예제 소스를 수행하면 아래와 같은 응답을 얻을 수 있다.

requestType 이 어떤 의미인지 아직 확인해보진 못했지만 원래 얻고자 했던 정보들이 일별 시세였기에 필요한 정보는 얻어 해당 함수들로 다른 종목들의 시세도 모두 불러올 수 있다.

 

마치며

위에서 설명한 방법은 네이버 Finance 뿐만 아니라 개발자가 얻고 싶은 정보가 웹서버에 있는 경우 브라우저의 개발자 도구로 XHR 정보를 확인하여 서버에서 브라우저로 API 형태로 제공 중인지 확인하여, 편리하게 데이터를 얻을 수 있기에 여러 방면에 활용이 가능하다.

만약 원하는 정보가 XHR 에 없다면 보고 있는 페이지의 HTML 에서 데이터를 추출해야 하며 이는 나중에 따로 블로그를 해야겠다.

 

다시 한번 주의할 사항은, 앞서 설명한 것 처럼 해당 API 는 외부에 공개하여 여러 개발자들이 스크립트나 프로그램 등으로 과다하게 호출하는 경우 자신의 IP 가 해당 서버로 접근되는게 막히거나 네이버에서 API 형태로 제공이 되지 않는 방식등으로 바꿀 수 있기에.... 내 서버는 아니지만 네이버의 Finance 서버에 부하가 가지 않도록 유의하는게 좋다.

반응형