본문 바로가기
파이썬 (투자분석용)/Pandas 및 python 일반

[python] 한국증시(코스피, 코스닥) 종목코드 받아오기

by amAToRoi 2022. 1. 29.
반응형

주식 관련 웹 스크래핑(web scrapping)을 위해서는 각 종목의 종목코드가 필요하다.

1. 종목코드란?


종목코드란, 상장된 기업을 특정할 수 있는 고유 문자(숫자)
이를 테면 삼성전자의 경우 005930 이며,
미국의 나스닥 시장에 상장된 Microsoft의 경우 MSFT 이다.

finance.naver.com과 finance.google.com에서 확인되는 종목코드(삼성전자의 005930과 마이크로소프트의 MSFT)


사람으로 치자면 주민등록번호에 해당된다고 볼 수 있다.
홍길동이 개명되어 홍서방이 된다고 해도 주민등록번호는 변화가 없어서 해당자를 특정할 수 있는 것처럼…
물론, 페이스북은 사명변경이후 종목코드(티커)도 변경하려고 한다. 뭐... 사람도 성전환하면 바꾸니까...

한국거래소(KRX)에서는 코스피, 코스닥 및 코넥스에 상장된 기업에 대하여,
종목코드를 포함한 정보를 홈페이지를 통해서 제공한다.

주의사항

  1. 추출하는 홈페이지가 개편되면 관련 정보를 스크래핑하기 위한 방식을 바꿔야 하기에 지속적인 관리가 필요하다.
  2. 과도한 웹 스크래핑은 해당 홈페이지에 악영향을 줄 수 있기 때문에 스스로 책임져야 한다. (과도하게 스크래핑하면, 차단당할 수 도…)


참고: 한국거래소의 정보데이터시스템은 2021년 1월 18일 개편된 적이 있다.

이제 한국거래소의 다양한 페이지에서 종목코드를 추출해보자.
크롬에서 개발자도구(DevTool, 단축키 F12)를 활용한다.

2-1. 기업공시채널(KIND)에서 추출하기 (Pandas)

<기업공시채널, https://kind.krx.co.kr>

개발자도구(F12) - 새로고침(F5) - Network - corpList.do 선택 - Payload

기업공시채널  → 상장법인상세정보  → 상장법인목록 페이지에 들어가서 Network를 확인해보면, corpList.do 로 페이지가 구성됨을 볼 수 있다. 따라서, 기본 url은 Header와 주소창에서 확인가능한... 아래 주소이다.

https://kind.krx.co.kr/corpgeneral/corpList.do

아울러, 페이지구성을 위한 파라미터들은 Payload에서 확인가능한, method, pageIndex, currentPageSize, marketType 등이 있다.

각각의 파라미터의 의미를 찾기에는 노가다가 너무 심해서... 페이지 본문에 있는 Excel 다운로드 기능을 사용해보기로 하자. 개발자도구에서 Elements로 들어가서 보면, EXCEL 버튼이 fnDownload 라는 기능을 사용함을 볼 수 있고, fnDownload를 찾아보면 method의 변수를 "download"로 사용함을 볼 수 있다. 
currentPageSize는 한 페이지당 보여주는 기관의 수이며 pageIndex는 펼쳐보고자하는 페이지 번호로 추정되나 기본값으로 추정된다. 노가다로 확인해보았다.

또한, 시장구분을 바꾸어보며 확인해보면, marketType=stockMkt 이면 유가증권(코스피)이며, marketType=kosdaqMkt이면 코스닥임을 알 수 있다.

EXCEL 다운로드 버튼의 기능 은 fnDownload() 임
EXCEL 다운로드 버튼의 기능( fnDownload() )으로 method 변수를 찾음! 유레카!

 

이제 주소를 알았으니 심플하게 종목코드가 포함된 데이터를 python에서 활용가능한 데이터로 변환해보자.

import pandas

df = pandas.read_html('https://kind.krx.co.kr/corpgeneral/corpList.do?method=download')

판다스(pandas)의 강~력한 read_html 모듈을 활용하자. 

Thank you, Pandas & Python !
requests 패키지 없이 pandas 패키지 만으로 단 2줄 만에 추출된다.

 

코드 실행결과
코스피, 코스닥 및 코넥스 까지 총 2489개 기관의 종목코드가 추출되었다. (우선주 등 제외)

 

2-2. KRX 정보데이터시스템(DATA)에서 추출하기 (Requests)

KRX 정보데이터시스템, https://data.krx.co.kr

KRX, [12005] 전종목 기본정보
[12005] 전종목 기본정보에서 우측의 다운로드를 통해 엑셀 형태로 다운로드 가능

위의 방식과는 달린 Requests 패키지로 post 모듈 및 JSON을 활용한 방식인데, 이는 웹(web)의 작동방식과 json 구조 모두를 이해해야만 구체적인 설명이 가능하다. 즉, 나는 설명이 불가능하다. :) 헤에.. 이에, 도구적 측면에서만 절차를 설명하고자 한다. "복붙의 자세"만 가지고 있다면 충분히 활용할 수 있다고 판단된다. 아래는 스터디 과정에서 찾은 설명을 잘하는 다른 분의 로그이자, 책이다.
[참고] https://hyunyulhenry.github.io/quant_cookbook/

쓰다보니 졸려서... 일단 코드만 남겨둔다. 다음에 덧붙일지도...

핵심은,
크롬 개발자도구(F12)의 Network → Header 및 Payload를 확인해서
otp_data를 입맛에 맞게 고치는 것이다.

generate.cmd로 OTP를 받아서, download.cmd에 제출함으로써 데이터를 받는 방식이라고 한다.

import pandas
import requests
from io import BytesIO

# 0. 공통 헤더
headers = {'Referer': 'http://data.krx.co.kr/contents/MDC/MDI/mdiLoader'}

# 1. OTP 받기
otp_url = 'http://data.krx.co.kr/comm/fileDn/GenerateOTP/generate.cmd'
otp_data = {
    'locale': 'ko_KR',
    'mktId': 'ALL',
    'share': '1',
    'csvxls_isNo': 'false',
    'name': 'fileDown',
    'url': 'dbms/MDC/STAT/standard/MDCSTAT01901'
}
otp = requests.post(otp_url, otp_data, headers=headers).text

# 2. 데이터 다운로드
data_url = 'http://data.krx.co.kr/comm/fileDn/download_csv/download.cmd'
data  = requests.post(data_url, {'code':otp}, headers=headers)

# 3. 판다스 DataFrame으로 변환
df = pandas.read_csv(BytesIO(data.content), encoding='EUC-KR')

코드 실행결과
코스피, 코스닥 및 코넥스에 상장된 총 2611개 종목코드가 추출되었다. (기관 수 아님)

 

반응형

댓글