활동/연구학점제

한국 거래소 코스피&코스닥 전종목 데이터 크롤링

짐니♡ 2023. 7. 19. 19:04

연구학점제 시간에 진행한 코스피&코스닥 전종목 데이터 크롤링 정리본 중 일부입니다 !

 

Chapter 2. 데이터 크롤링

2-(1) 기본 셋팅 & 필요한 모듈과 패키지 설명

2-(2) 한국 거래소 코스피 데이터 크롤링

2-(3) 한국 거래소 코스닥 데이터 크롤링

 


2-(1) 기본 셋팅 & 필요한 모듈과 패키지 설명

 

 

기본 셋팅

 

from google.colab import drive

drive.mount ('/content/drive')

- 위 코드는 구글 코랩 환경에서 구글 드라이브와 연결하는 것을 의미함

- 일반적으로 위 코드는 코랩에서 구글 드라이브에 저장된 데이터나 파일을 불러오거나

- 코랩에서 생성된 결과를 구글 드라이브에 저장하기 위해 사용됨

 

 

필요한 모듈과 패키지 설명

 

import re  

from datetime import date

import requests as rq

from io import BytesIO

import pandas as pd

import re

- re는 정규 표현식(regular expression)을 사용하여 문자열을 처리하는 기능을 제공

 

from datetime import date

- datetime 모듈에서 date 클래스를 가져옴 date 클래스는 날짜를 다루는 기능을 제공

 

import requests as rq

- requests 모듈을 가져옴 requestsHTTP 요청을 보내고 받는 기능을 제공하여

웹 상의 데이터를 가져오는 데 사용

- as rqrequestsrq라는 짧은 이름으로 사용하겠다는 의미

 

from io import BytesIO

- io 모듈에서 BytesIO 클래스를 가져옴

- BytesIO 클래스는 메모리에 바이트 데이터를 읽고 쓰는 기능을 제공

 

import pandas as pd

- pandas 모듈을 가져옴 pandas는 데이터 조작과 분석을 위한

효율적인 데이터 구조와 도구를 제공

- as pdpandaspd라는 짧은 이름으로 사용하겠다는 의미

 

a = str (date.today ())

biz_day = re.findall ('[0-9]+', a )

biz_day = ''.join (biz_day )

date모듈에서 today() 함수를 사용하여 현재 날짜를 가져 온 후, str() 함수를 사용하여

문자열을 변환한 뒤 a 변수에 저장

 

2-1. re 모듈의 findall() 함수를 사용하여 문자열 a에서 숫자로 이루어진 부분을 찾아 리스트 형태로 반환

2-2. 정규 표현식 ‘[0-9]+’은 연속된 하나 이상의 숫자를 의미,

biz_day 변수에는 a 문자열에서 추출된 숫자 부분이 리스트 형태로 저장됨

 

3-1. join() 함수를 사용하여 biz_day 리스트의 각 요소를 연결하여 하나의 문자열로 만듦

3-2. ‘’은 각 요소 사이에 아무것도 넣지 않겠다는 의미(공백)

3-3. biz_day 변수에는 숫자로 이루어진 부분이 하나의 문자열로 저장이 됨

3-4. 예를 들어 오늘 날짜가 202376일인 경우 biz_day 변수에는 20230706이 저장됨

 

print (biz_day )

> 20230706

 


2-(2) 한국 거래소 코스피 데이터 크롤링

 

otp_url = 'http://data.krx.co.kr/comm/fileDn/GenerateOTP/generate.cmd'

 

OTP를 받기 위해 제출할 주소

 

otp_payload = {
  'locale':'ko_KR',
  'mktId':'STK',        
  'trdDd': biz_day ,        
  'money':'1',
  'csvxls_isNo':'false',
  'name':'fileDown',
  'url':'dbms/MDC/STAT/standard/MDCSTAT03901'
}

- otp_payload라는 변수에 우리가 요청할(가져올) 데이터들을 딕셔너리 형태로 만들어 줌

STK -> 코스피, KSQ -> 코스닥

날짜 데이터 = biz_day 변수를 이용해 오늘 날짜를 문자열으로 계속 반환

 

 

headers = {'Referer':'http://data.krx.co.kr/contents/MDC/MDI/mdiLoader'}
otp_key = rq.post (otp_url , otp_payload , headers=headers ).text

- 헤더 부분에 리퍼러(referer)를 추가

리퍼러란 링크를 통해서 각각의 웹사이트로 방문할 때 남는 흔적

데이터를 다운로드 하는 과정을 살펴보면 첫 번째 URL에서 OTP를 부여받고, 이를 다시 두 번째 URL에 제출함. 이러한 과정의 흔적이 없이 OTP를 바로 두 번째 URL에 제출하면 서버는 이를 로봇으로 인식해 데이터를 주지 않음

따라서 헤더 부분에 우리가 거쳐온 과정을 흔적으로 남겨야 데이터를 받을 수 있음

 

down_url = 'http://data.krx.co.kr/comm/fileDn/download_csv/download.cmd'

- down_url라는 변수에 요청할 URL을 입력

kospi_down = rq.post (down_url ,{'code': otp_key }, headers=headers )
kospi = pd.read_csv (BytesIO (kospi_down.content ), encoding='EUC-KR')

- post 함수를 사용해 해당 url에 접속하여 otp 코드를 제출함

read_csv함수의 형식에 적합할 수 있도록 BytesIO함수를 이용하여 바이너 스트림 형태로 만듦

 

 


 

2-(3) 한국 거래소 코스닥 데이터 크롤링

 

코스피와 같은 방식으로 진행

 

otp_url = 'http://data.krx.co.kr/comm/fileDn/GenerateOTP/generate.cmd'

 

OTP를 받기 위해 제출할 주소

 

otp_payload1 = {
  'locale':'ko_KR',
  'mktId':'KSQ',  
  'trdDd': biz_day ,
  'money':'1',
  'csvxls_isNo':'false',
  'name':'fileDown',
  'url':'dbms/MDC/STAT/standard/MDCSTAT03901'
}

 

STK -> 코스피, KSQ -> 코스닥

관련 내용을 딕셔너리 형태로 입력

 

headers = {'Referer':'http://data.krx.co.kr/contents/MDC/MDI/mdiLoader'}
otp_key1 = rq.post (otp_url1 , otp_payload1 , headers=headers ).text
down_url = 'http://data.krx.co.kr/comm/fileDn/download_csv/download.cmd’
kosdaq_down = rq.post (down_url ,{'code': otp_key1 }, headers=headers )
kosdaq = pd.read_csv (BytesIO (kosdaq_down.content ), encoding='EUC-KR')