ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코딩_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. 마무리하기

     

    함수들을 전부 만들었으니 잘 실행되는지 확인을 해봅시다.

    맨 처음에 찾아보고 싶은 종목의 이름을 변수로 설정해둔 이후, 함수들을 순차적으로 실행시킵니다.

    1. 전종목 기본정보를 불러오기
    2. 표준코드 조회하기
    3. 종목코드 조회하기
    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)

     

    코드 실행 결과는 다음과 같습니다.

    실행 결과

     

    이상으로 크롤링한 종목정보를 이용해 종목명으로 표준코드, 종목코드 찾기를 해보았습니다.

    다음에는 최종 목표인 종목명을 입력하면 주가 정보를 자동으로 크롤링해보도록 하겠습니다.

    어렵고 복잡해 보일 수 있지만 다들 잘 따라오셨기를 바랍니다.

     

    감사합니다.

     

    반응형

    댓글

Designed by Tistory.