티스토리 뷰

네이버 크롤링에 이어

KRX증권거래소 전종목 가격을 불러와보려고 한다.

 

그 이유는 전 종목의 코드가 들어있기도 하고, 

무엇보다 "시가총액" 데이터가 들어있기 때문이다.

 

시가총액이 들어있다 :)

 

확인해보니 1995년 5월 부터의 데이터가 들어있었기 때문에 충분? 하다고 생각

어쨌든 주가보다는 시가총액이 종목 가치를 나타내는 더 정확한 지표이기 때문에

, KRX에서 데이터를 다운받을 수 있다면 정말 좋겠다고 생각했다.

 

오늘 받아올 것은

  • KOSPI 전종목 리스트 
  • 종목별, 일자별 시가총액 데이터

KOSPI 전종목 리스트

위 화면에서 '조회' 버튼을 누르면 'getJsonData.cmd'가 호출 되는데 이를 살펴보면 다음과 같다

요청시 필요한 header정보와 parameters
response로 받게 되는 정보

 

코드

import requests
import pandas as pd
import json

#주식 종목 받기 함수
def getStockList():
    #요청 Url
    requestUrl = 'http://data.krx.co.kr/comm/bldAttendant/getJsonData.cmd'
    
    #요청시 넘겨줄 pramaters
    params ={
        'bld': 'dbms/MDC/STAT/standard/MDCSTAT01901',
        'locale': 'ko_KR',
        'mktId': 'ALL',
        'share': '1',
        'csvxls_isNo': 'false'
    }
    
    #요청시 헤더 정보
    headers = {
        'Referer': 'http://data.krx.co.kr/contents/MDC/MDI/mdiLoader/index.cmd?menuId=MDC0201',
        'Upgrade-Insecure-Requests': '1', 
        # HTTP Content-Security-Policy (CSP) upgrade-insecure-requests 지시문은 
        # 사이트의 모든 비보안 URL(HTTP를 통해 제공되는 URL)을 
        # 보안 URL(HTTPS를 통해 제공되는)로 대체된 것처럼 처리하도록 사용자 에이전트에 지시
        # [출처] http 헤더 Upgrade-Insecure-Requests|작성자 겨울나무
        'User-Agent': 'Mozilla/5.0'
    }
    
    response = requests.get(requestUrl, params, headers=headers)
    
    #Byte정보 --> decode --> jason --> dataframe
    dataByte = response.content
    dataDecoded = dataByte.decode('utf8')
    data = json.loads(dataDecoded)
    dataJson = json.dumps(data, indent=4, sort_keys=True)
    df = pd.read_json(dataJson)
    
    df = df['OutBlock_1']
    print(type(df[0]), df[0])
    
    newDf = pd.DataFrame(data=[df[0]])
    
    for i in range(1, df.size):
        newDf = pd.concat([newDf, pd.DataFrame(data=[df[i]])], ignore_index=True)
        
    return newDf    

#리스트 정보 받아와서
stocksDf = getStockList()

#날짜순으로 정리
stocksDf = stocksDf.sort_values(by="ISU_SRT_CD", ascending= True)

#저장
stocksDf.to_csv('경로/파일이름')

결과


 

종목별, 일자별, 시가총액

 

위 화면에서 '조회' 버튼을 누르면 'getJsonData.cmd'가 호출 되는데 이를 살펴보면 다음과 같다

요청시 필요한 정보
요청에 대한 응답 정보

 

코드

from time import sleep
import requests
import pandas as pd
from datetime import datetime
import json

path = '저장경로'
today = datetime.now().strftime("%Y%m%d")

#받아온 리스트 불러오기
def getCodeList(columnName):
    df = pd.read_csv('경로/파일이름')
    list = df[columnName].values.tolist()
    return list

#종목별로 가격데이터 크롤링
def getStockPriceDataFromKRX(fCode, sCode, stockName):

    # 요청 주소
    requestUrl = 'http://data.krx.co.kr/comm/bldAttendant/getJsonData.cmd'
    
    # 요청시 넘겨줄 인자, payload에서 볼 수 있음
    params = {
        'bld': 'dbms/MDC/STAT/standard/MDCSTAT01701',
        'locale': 'ko_KR',
        'tboxisuCd_finder_stkisu0_2': sCode + '/' + stockName,
        'isuCd': fCode,
        'isuCd2': fCode,
        'codeNmisuCd_finder_stkisu0_2': stockName,
        'param1isuCd_finder_stkisu0_2': 'ALL',
        'strtDd': '19950502',
        'endDd': today,
        'share': '1',
        'money': '1',
        'csvxls_isNo': 'false'
    }
    
    #request header
    headers = {
        'Referer': 'http://data.krx.co.kr/contents/MDC/MDI/mdiLoader/index.cmd?menuId=MDC0201',
        'Upgrade-Insecure-Requests': '1', 
        # HTTP Content-Security-Policy (CSP) upgrade-insecure-requests 지시문은 
        # 사이트의 모든 비보안 URL(HTTP를 통해 제공되는 URL)을 
        # 보안 URL(HTTPS를 통해 제공되는)로 대체된 것처럼 처리하도록 사용자 에이전트에 지시
        # [출처] http 헤더 Upgrade-Insecure-Requests|작성자 겨울나무

        'User-Agent': 'Mozilla/5.0'
    }
    
    # 서버에 요청
    response = requests.get(requestUrl, params, headers=headers)
    
    #요청받은 자료=Byte --> jason --> dataframe
    dataByte = response.content
    dataDecoded = dataByte.decode('utf8')
    data = json.loads(dataDecoded)
    dataJson = json.dumps(data, indent=4, sort_keys=True)
    df = pd.read_json(dataJson)
    
    df = df['output']
    newDf = pd.DataFrame(data=[df[0]])
    
    for i in range(1, df.size):
        newDf = pd.concat([newDf, pd.DataFrame(data=[df[i]])], ignore_index=True)
        
    return newDf

#종목 리스트에서 간편코드, 풀코드, 종목명 불러오기
fCodeList = getCodeList('ISU_CD')
sCodeList = getCodeList('ISU_SRT_CD')
nameList = getCodeList('ISU_ABBRV')

stockPriceDf = getStockPriceDataFromKRX(fCodeList[0], sCodeList[0], nameList[0])

dfFinal = pd.DataFrame({'TRD_DD': stockPriceDf['TRD_DD']}) #TRD_DD=날짜 column 가진 파일 생성

#각 종목별로 가격데이터 크롤링
for i in range (0, len(sCodeList)):
    print ("current trial is {}/{}".format(i, len(sCodeList)) + nameList[i])
    rawDf = getStockPriceDataFromKRX(fCodeList[i], sCodeList[i], nameList[i])
    
    #시가총액 부분만 불러와서 붙이기
    tempDf = pd.DataFrame({'TRD_DD' : rawDf['TRD_DD'], nameList[i] : rawDf['ACC_TRDVAL']})
    dfFinal = pd.merge(dfFinal, tempDf, how = 'outer', on='TRD_DD')
    dfFinal.to_csv(path + 'KRX_PriceAll_1') # 저장

    sleep(5)

print('all done')

결과

 

끝.


참고사이트

http://data.krx.co.kr/contents/MDC/MDI/mdiLoader/index.cmd?menuId=MDC0201020201 

 

 

KRX 정보데이터시스템

증권·파생상품의 시장정보(Marketdata), 공매도정보, 투자분석정보(SMILE) 등 한국거래소의 정보데이터를 통합하여 제공 서비스

data.krx.co.kr

https://blog.naver.com/ellijahbyeon/222213048898

 

한국거래소 KRX 정보데이터시스템 주식 시세 크롤링

한국거래소에서 시장정보포털 <KRX 정보데이터시스템>(http://data.krx.co.kr)을 새롭게 오픈함에...

blog.naver.com

https://blog.naver.com/patent21/222037336954

 

[공유] krx-stock-api

krx-stock-api krx-stock-api는 간편하게 한국거래소(KRX)의 API를 사용할 수 있는 라이브러리입니다...

blog.naver.com

 

728x90

'IT' 카테고리의 다른 글

Php배우기(1)-서버(Server)와 클라이언트(Client)란?  (0) 2020.02.12
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함