-
[코딩_04] 크롤링한 종목정보를 이용해 종목명으로 표준코드, 종목코드 찾기개발일지 2022. 10. 9. 00:39반응형
종목명으로 표준코드, 종목코드 찾기 안녕하세요.
지난번에는 'KRX 정보 데이터 시스템'에서 전종목 기본정보를 크롤링해 엑셀에 저장해보았습니다.
2022.10.01 - [개발일지] - [코딩_03] KRX 정보 데이터 시스템에서 전종목 기본정보 가져오기 (KRX 크롤링)
[코딩_03] KRX 정보데이터시스템에서 전종목 기본정보 가져오기 (KRX 크롤링)
안녕하세요. 비주얼 스튜디오 코드 설치와 확장 프로그램 설치까지 끝났다면, 이제는 본격적으로 코딩을 해보아야겠죠? 오늘은 'KRX 정보데이터시스템'에서 전종목 기본정보를 크롤링해보려 합
always-good.tistory.com
저의 최종 목표는 종목명을 입력하면 주가 정보를 자동으로 크롤링하는 것 입니다.
이를 만들기 위한 두 번째 스텝, '종목명으로 종목코드 조회하기'
지금 바로 시작하겠습니다!
0. 전체 코드 보기
전체 코드 내용만 궁금하신 분은 더보기를 눌러서 확인해주세요!
더보기import requests import pandas as pd from io import BytesIO def mk_all_stock_info(): gen_otp_url = 'http://data.krx.co.kr/comm/fileDn/GenerateOTP/generate.cmd' gen_otp_data = { 'locale': 'ko_KR', 'mktId': 'ALL', 'share': '1', 'csvxls_isNo': 'false', 'name': 'fileDown', 'url': 'dbms/MDC/STAT/standard/MDCSTAT01901' } headers = {'Referer' : 'http://data.krx.co.kr/contents/MDC/MDI/mdiLoader'} otp = requests.post(gen_otp_url, params=gen_otp_data, headers=headers).text down_url = 'http://data.krx.co.kr/comm/fileDn/download_csv/download.cmd' down_data = { 'code' : otp } down_stock_info = requests.post(down_url, params=down_data, headers=headers) stock_info = pd.read_csv(BytesIO(down_stock_info.content), encoding='EUC-KR', index_col='한글 종목약명') return stock_info def find_stock_std_code(name, stock_info): """ 종목명을 기준으로 표준코드 반환 Args: name (string): 표준코드를 찾고자 하는 종목의 종목명 (한글 종목약명) stock_info (dataframe): 한글 종목약명(index), 표준코드, 단축코드를 갖는 데이터프레임 Returns: string: 찾고자 하는 종목의 표준코드 """ try: stock_std_code = stock_info.loc[name, '표준코드'] return stock_std_code except KeyError: print('종목명이 잘못되었습니다') except: print('error') def find_stock_code(name, stock_info): """ 종목명을 기준으로 단축코드 반환 Args: name (string): 표준코드를 찾고자 하는 종목의 종목명 (한글 종목약명) stock_info (dataframe): 한글 종목약명(index), 표준코드, 단축코드를 갖는 데이터프레임 Returns: string: 찾고자 하는 종목의 단축코드 """ try: stock_code = stock_info.loc[name, '단축코드'] return stock_code except KeyError: print('종목명이 잘못되었습니다') except: print('error') stock_name = '삼성전자' # 함수 호출 all_stock_info = mk_all_stock_info() std_code = find_stock_std_code(stock_name, all_stock_info) code = find_stock_code(stock_name, all_stock_info) print(std_code, code)
1. 라이브러리 및 함수 임포트
크롤링을 하기 위한 라이브러리들을 Import 해줍니다.
각각의 라이브러리들은 다음과 같은 역할을 수행합니다.
이번에는 엑셀에 저장을 하지 않을 것이기 때문에 openpyxl은 포함하지 않아도 괜찮습니다.
- requests: 크롤링을 위한 라이브러리
- pandas: 데이터 형식을 손쉽게 다루기 위한 라이브러리
- io: I/O(Input/Output) 관리를 위한 라이브러리
import requests import pandas as pd from io import BytesIO
그리고 지난번 게시글에서 열심히 만들었던, 전종목 기본정보 크롤링 함수를 가져옵니다.
def mk_all_stock_info(): gen_otp_url = 'http://data.krx.co.kr/comm/fileDn/GenerateOTP/generate.cmd' gen_otp_data = { 'locale': 'ko_KR', 'mktId': 'ALL', 'share': '1', 'csvxls_isNo': 'false', 'name': 'fileDown', 'url': 'dbms/MDC/STAT/standard/MDCSTAT01901' } headers = {'Referer' : 'http://data.krx.co.kr/contents/MDC/MDI/mdiLoader'} otp = requests.post(gen_otp_url, params=gen_otp_data, headers=headers).text down_url = 'http://data.krx.co.kr/comm/fileDn/download_csv/download.cmd' down_data = { 'code' : otp } down_stock_info = requests.post(down_url, params=down_data, headers=headers) stock_info = pd.read_csv(BytesIO(down_stock_info.content), encoding='EUC-KR', index_col='한글 종목약명') return stock_info
지난번에 고려하지 못했던 부분인데, 18행 stock_info로 CSV 파일을 읽어올 때 데이터 프레임의 인덱스를 설정해야 합니다.
인덱스를 설정하는 이유는 종목명을 기준으로 종목코드를 찾기 때문입니다.
(아래의 코드가 바뀐 것입니다.)
# stock_info = pd.read_csv(BytesIO(down_stock_info.content), encoding='EUC-KR') index를 설정해야합니다. stock_info = pd.read_csv(BytesIO(down_stock_info.content), encoding='EUC-KR', index_col='한글 종목약명')
데이터 프레임의 행과 열은 자주 헷갈립니다.
헷갈릴 수 있으니 예시를 통해 한번 더 확인해보고 갑시다.
데이터프레임 행, 열 mk_all_stock_info()을 통해 반환하는 전종목 기본정보에 대한 데이터 프레임은 하단의 이미지 모습과 같습니다.
한글 종목약명을 인덱스로 행 이름이 되며, 표준코드, 단축코드, 한글 종목명 등이 열 이름이 됩니다.
전종목 기본정보를 데이터프레임으로 만든 모습 2. 표준코드 조회 함수 만들기
저 같은 주린이에게 종목코드(단축코드)는 익숙하지만 표준코드는 생소할 수 있습니다.
증권 표준코드는 모든 증권상품에 개별적으로 부여되고 있는 12자리 고유번호이며, 해외에서는 국제증권식별번호(ISIN : International Securities Identification Number)라는 명칭으로 널리 통용되고 있습니다.
(출처: KRX 표준코드 시스템 https://isin.krx.co.kr/main/main.do)
종목코드는 표준코드를 단축해서 사용하는 것입니다.
나중에 주가를 크롤링해올 때 사용되기 때문에 익숙하지 않더라도 조회를 한번 해봅시다!
코드는 정말 쉽습니다.
find_stock_std_code라는 이름으로 종목명과 조회할 데이터 프레임을 변수로 받습니다.
데이터 프레임에서 행, 열을 조회할 때 사용한 loc에 대해서 간단하게 말씀드리자면, 데이터 프레임의 인덱스(행 이름)를 기준으로 열들의 값을 찾는 것입니다.
우리는 이 loc를 이용해 검색하고 싶은 종목명을 넣고 '표준코드'(열 이름)의 값을 가져오는 것이 목표입니다.
종목명 조회에 문제가 없다면 표준코드의 값을 반환하고, 잘못된 종목명을 입력했을 경우에는 알림을 줄 수 있도록 합니다.
예를 들어 '삼성전자'를 변수로 준다면 'KR7005930003'을 반환해주는 것입니다.
def find_stock_std_code(name, stock_info): """ 종목명을 기준으로 표준코드 반환 Args: name (string): 표준코드를 찾고자 하는 종목의 종목명 (한글 종목약명) stock_info (dataframe): 한글 종목약명(index), 표준코드, 단축코드를 갖는 데이터프레임 Returns: string: 찾고자 하는 종목의 표준코드 """ try: stock_std_code = stock_info.loc[name, '표준코드'] return stock_std_code except KeyError: print('종목명이 잘못되었습니다') except: print('error')
3. 종목코드(단축코드) 조회 함수 만들기
종목코드 조회 함수는 표준코드 조회 함수와 거의 비슷합니다.
loc를 활용할 때 열 이름을 '단축코드'로 선택하는 것만 다릅니다.
예를 들어'삼성전자'를 변수로 준다면 '005930' 을 반환해주는 것입니다.
def find_stock_code(name, stock_info): """ 종목명을 기준으로 단축코드 반환 Args: name (string): 표준코드를 찾고자 하는 종목의 종목명 (한글 종목약명) stock_info (dataframe): 한글 종목약명(index), 표준코드, 단축코드를 갖는 데이터프레임 Returns: string: 찾고자 하는 종목의 단축코드 """ try: stock_code = stock_info.loc[name, '단축코드'] return stock_code except KeyError: print('종목명이 잘못되었습니다') except: print('error')
4. 마무리하기
함수들을 전부 만들었으니 잘 실행되는지 확인을 해봅시다.
맨 처음에 찾아보고 싶은 종목의 이름을 변수로 설정해둔 이후, 함수들을 순차적으로 실행시킵니다.
- 전종목 기본정보를 불러오기
- 표준코드 조회하기
- 종목코드 조회하기
- 조회한 표준코드와 종목코드를 print로 확인해보기
stock_name = '삼성전자' # 함수 호출 all_stock_info = mk_all_stock_info() std_code = find_stock_std_code(stock_name, all_stock_info) code = find_stock_code(stock_name, all_stock_info) print(std_code, code)
코드 실행 결과는 다음과 같습니다.
실행 결과 이상으로 크롤링한 종목정보를 이용해 종목명으로 표준코드, 종목코드 찾기를 해보았습니다.
다음에는 최종 목표인 종목명을 입력하면 주가 정보를 자동으로 크롤링해보도록 하겠습니다.
어렵고 복잡해 보일 수 있지만 다들 잘 따라오셨기를 바랍니다.
감사합니다.
반응형'개발일지' 카테고리의 다른 글
[코딩_05] 종목명으로 KRX에서 주가정보 가져오기 (0) 2022.12.27 [코딩_03] KRX 정보데이터시스템에서 전종목 기본정보 가져오기 (KRX 크롤링) (2) 2022.10.01 [코딩_02] 비주얼 스튜디오 코드 확장 프로그램 설치 (0) 2022.09.29 [코딩_01] 비주얼 스튜디오 코드(Visual Studio Code) 설치 (0) 2022.09.13