삶의 공유

[데이터수집] 한국 거래소 업종 분류 현황 및 개별 지표 크롤링 하기 본문

Data Scientist/Python

[데이터수집] 한국 거래소 업종 분류 현황 및 개별 지표 크롤링 하기

dkrehd 2021. 10. 27. 17:48
728x90
반응형

※ 이 포스팅은 https://hyunyulhenry.github.io/quant_python/05_crawl_practice.html 를 참고 하여 만든 내용입니다.

한국 거래소의 업종 분류 현황 및 개별지표 크롤링

파이썬을 이용하여 업종 분류 현황을 크롤링 해보자.

 

1. 업종 정보를 받아오기 위해 한국 거래소 사이트에 접속하여 기본 통계 → 주식 → 세부 안내 → 업종분류 현황 클릭한다.

2. 그럼 하기 이미지와 같은 화면이 나온다. 이 화면에서 보기 > 개발자 정보 > 개발자 도구를 들어간다 (마우스 우클릭 후 "검사"항목 클릭해도 된다.)

3. 개발자 도구가 이렇게 뜨면 하기 빨간색 박스로 되어 있는 Network 탭을 클릭 후, 왼쪽에 파란색 다운로드 버튼을 클릭한다.

그럼 다운로드를 Excel 형식으로 받을 것인지 CSV 형식으로 받을 것인지 확인 할 수 있다. 여기서는 CSV 형식으로 다운을 받는다.

4. CSV를 선택하면 개발자 도구의 네트워크 탭에서 generate.cmd와 download.cmd파일이 생기면서 크롬 좌측 하단에는 csv파일이 다운로드 되는 것을 볼 수 있다.

정리하면, 하기 이미지 처럼 Network Tab에 있는 Request URL에 원하는 항목을 쿼리로 발송하면, 해당 쿼리에 해당하는 OTP(generate.cmd)를 부여 받게 되고, 이 부여 받은 OTP를 http:data.krx.co.kr/에 제출하면 이에 해당 하는 데이터(download.cmd)를 다운로드 할 수 있게 되는 것이다.

download.cmd를 살펴보면 이렇게 General(Request URL, Form Data)가 구성되어 있는 것을 볼 수 있다.

 

위 과정을 파이썬 코드로 나타내면 다음과 같다.

 

import requests as rq
from io import BytesIO
import pandas as pd
# generate.cmd에서 Request URL과 동일
gen_otp_url = 'http://data.krx.co.kr/comm/fileDn/GenerateOTP/generate.cmd'
# generate.cmd에서 Form Data와 동일
gen_otp_data = {
  'mktId': 'STK',
  'trdDd': '20211027',
  'money': '1',
  'csvxls_isNo': 'false',
  'name': 'fileDown',
  'url': 'dbms/MDC/STAT/standard/MDCSTAT03901'
}
# 헤더 부분에 리퍼러(Referer)를 추가합니다. 
# 리퍼러란 링크를 통해서 각각의 웹사이트로 방문할 때 남는 흔적입니다. (로봇으로 인식을 하지 않게 하기 위함.)
headers = {'Referer': 'http://data.krx.co.kr/contents/MDC/MDI/mdiLoader'}
otp = rq.post(gen_otp_url, gen_otp_data, headers=headers).text

print(otp)

실행결과,

vg4f5H6kQlRc+XE/JDqbj/q9XdiwgErvrQMjA/XcO+0RtSksuLS7Bnxpl86F7dAOkunw9BBwugQaSjGAcH15ed5LOzH4mS

bUJy5E/t0oMsUtBgM+EFJCxYg3zco1gIgRZqIo4cIzoURnTI8+MmkJ4m8vFLhSKmM794gFu+ThsO31lY4woqehX8j6OlXFDcfHdV4NbYo4+D2Rwcfj24VnU3Zpq3ik/Dyw3FdyOXhJkBI=

 

자세히 보면 download.cmd의 Form Data와 일치하는 것을 볼 수 있다.

 

이 결과를 download.cmd Request URL에 제출하면, 우리가 원하는 데이터를 다운로드 할 수 있다.

코드로 보면 다음과 같다

 

#download.cmd 에서 General의 Request URL 부분
down_url = 'http://data.krx.co.kr/comm/fileDn/download_csv/download.cmd'
# requests Module의 post함수를 이용하여 해당 url에 접속하여 otp코드를 제출함
down_sector_KS  = rq.post(down_url, {'code':otp}, headers=headers)
# 다운 받은 csv파일을 pandas의 read_csv 함수를 이용하여 읽어 들임. 
# read_csv 함수의 argument에 적합할 수 있도록 BytesIO함수를 이용하여 바이너 스트림 형태로 만든다.
sector_KS = pd.read_csv(BytesIO(down_sector_KS.content), encoding='EUC-KR')

이렇게 잘 가져오는 것을 볼 수 있다. 코스닥 시장의 상장 회사들도 동일하게 적용하면,

gen_otp_data = {
  'mktId': 'KSQ', # 코스닥 입력
  'trdDd': '20211027',
  'money': '1',
  'csvxls_isNo': 'false',
  'name': 'fileDown',
  'url': 'dbms/MDC/STAT/standard/MDCSTAT03901'
}
otp = rq.post(gen_otp_url, gen_otp_data, headers=headers).text         

down_sector_KQ  = rq.post(down_url, {'code':otp}, headers=headers)
sector_KQ = pd.read_csv(BytesIO(down_sector_KQ.content), encoding='EUC-KR')

이렇게 잘 가져 오는 것을 볼 수 있다.

반응형