티스토리 뷰
네이버 크롤링에 이어
KRX증권거래소 전종목 가격을 불러와보려고 한다.
그 이유는 전 종목의 코드가 들어있기도 하고,
무엇보다 "시가총액" 데이터가 들어있기 때문이다.
확인해보니 1995년 5월 부터의 데이터가 들어있었기 때문에 충분? 하다고 생각
어쨌든 주가보다는 시가총액이 종목 가치를 나타내는 더 정확한 지표이기 때문에
, KRX에서 데이터를 다운받을 수 있다면 정말 좋겠다고 생각했다.
오늘 받아올 것은
- KOSPI 전종목 리스트
- 종목별, 일자별 시가총액 데이터
KOSPI 전종목 리스트
위 화면에서 '조회' 버튼을 누르면 'getJsonData.cmd'가 호출 되는데 이를 살펴보면 다음과 같다
코드
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
https://blog.naver.com/ellijahbyeon/222213048898
https://blog.naver.com/patent21/222037336954
728x90
'IT' 카테고리의 다른 글
Php배우기(1)-서버(Server)와 클라이언트(Client)란? (0) | 2020.02.12 |
---|
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 머신러닝
- 일자별
- PYTHON
- requests
- 가격데이터
- 알고리즘
- Anet
- 주식
- Unity
- 경영학
- json
- 터틀트레이딩
- 사진크롤링
- 시스템투자
- 스타트업
- 비전공자
- 크롤링
- IT기초
- 강화학습
- 주식투자
- ET5X
- C#
- 심리학
- 프로그래머스
- 랜덤맵
- 마케팅
- 파이썬
- 유니티
- It
- beautifulsoup
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함