ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (OpenAPI)DART Open API 사용법3: 기업데이터 가공 in python
    금융퀀트/프로그램기초 2021. 2. 11. 13:52
    반응형

    1. OpenAPI로 XML 형식의 기업 데이터 단순 추출의 한계

      우리는 DART 에서 제공하는 OpenAPI를 python을 이용해서 아래 코드를 사용하면 "<  >"가 덕지덕지 붙어있는 XML 파일을 아래와 같이 얻을 수 있었다. ( 자세한 내용은 (OpenAPI)DART Open API 사용법2: 기업데이터 추출 in python 참조 )

      1) 데이터조회 코딩

    #라이브러리 읽어오는 부분----------------------------------------------------------
    import requests
    from bs4 import BeautifulSoup
    
    
    #URL을 조합하는 부분---------------------------------------------------------------
    url = "https://opendart.fss.or.kr/api/company.xml?"
    crtfc_key = "나의 API 키값 넣기"
    corp_code = "00126380"
    apitest = url+"crtfc_key="+crtfc_key+"&corp_code="+corp_code
    
    
    #XML파일 텍스트 읽어오기------------------------------------------------------------
    res = requests.get(apitest)
    soup = BeautifulSoup(res.text, "lxml")
    print(soup)

      2) XML 데이터 조회 결과

    <result>
    <status>000</status>
    <message>정상</message>
    <corp_code>00126380</corp_code>
    <corp_name>삼성전자(주)</corp_name>
    <corp_name_eng>SAMSUNG ELECTRONICS CO,.LTD</corp_name_eng>
    <stock_name>삼성전자</stock_name>
    <stock_code>005930</stock_code>
    <ceo_nm>김기남, 김현석, 고동진</ceo_nm>
    <corp_cls>Y</corp_cls>
    <jurir_no>1301110006246</jurir_no>
    <bizr_no>1248100998</bizr_no>
    <adres>경기도 수원시 영통구 삼성로 129 (매탄동)</adres>
    <hm_url>www.sec.co.kr</hm_url>
    <ir_url/>
    <phn_no>031-200-1114</phn_no>
    <fax_no>031-200-7538</fax_no>
    <induty_code>264</induty_code>
    <est_dt>19690113</est_dt>
    <acc_mt>12</acc_mt>
    </result>

      하지만 위처럼 산출된 데이터는 별 소용이 없다. ( 눈으로 확인하는 정도? )

      기업명 종목코드 대표자명 법인구분 법인
    등록번호
    사업자
    등록번호
    주소 업종코드
    1 삼성 005930 김기남.. Y 1301110006246 1248100998 경기도수원 12

      위 표 정도로 데이터가 정리가 되어야 데이터를 보기도 쉽고, 추가적인 기업 데이터를 위 칼럼에 맞춰서 아래쪽에 계속 추가해 줄 수 있다. python에서는 위와 같은 데이터 형식을 DataFrame이라고 한다. 결국 우리는 python을 이용해서 XML 데이터를 DataFrame 형식으로 ( 즉, 위 표처럼) 바꿔야지만 XML로 뽑아낸 데이터가 쓸모가 있어질 것이다. 

    2. XML 데이터 가공 with pandas

      1) 기본 라이브러리 설치

      데이터를 위 표처럼 가공하기 위해서 파이썬에서 필요한 라이브러리는 pandas 라는 라이브러리이다. anaconda cmd 창을 실행시켜서 아래 명령어를 통해서 pandas 라이브러리를 설치해 주면 된다. ( pandas는 근데 보통 anaconda python 설치하면 기본적으로 설치되어 있다. )

    pip install pandas

      2) XML 데이터 가공

      XML 데이터를 위 표처럼 가공하는 방법은 단계적으로 접근하면 쉽다. ①먼저 데이터를 넣을 DataFrame 빵틀을 만든다. ②XML에서 원하는 데이터를 뽑아낸다. ③ 뽑아낸 데이터를 DataFrame 빵틀에 추가한다. 

    import requests
    import pandas as pd
    from bs4 import BeautifulSoup
    # XML데이터 추출 앞단 과정----------------------------------------------------------
    url = "	https://opendart.fss.or.kr/api/company.xml?"
    crtfc_key = "나의 API 키값 넣기"
    corp_code = "00126380"
    apitest = url+"crtfc_key="+crtfc_key+"&corp_code="+corp_code
    res = requests.get(apitest)
    soup = BeautifulSoup(res.text, "lxml")
    # XML데이터 추출 앞단 과정----------------------------------------------------------
    
    # 데이터프레임 껍데기 만들기----------------------------------------------------------
    df = pd.DataFrame(columns=['기업명', '종목코드', '대표자명', '법인구분', 
        '법인등록번호', '사업자등록번호', '주소', '업종코드'])
    
    # XML 데이터를 변수에 넣기------------------------------------------------------------
    corp_name = soup.find("corp_name").text
    stock_code= soup.find("stock_code").text
    ceo_nm= soup.find("ceo_nm").text
    corp_cls= soup.find("corp_cls").text
    jurir_no= soup.find("jurir_no").text
    bizr_no= soup.find("bizr_no").text
    adres= soup.find("adres").text
    induty_code= soup.find("induty_code").text
    
    # 데이터 프레임틀에 데이터 row 추가----------------------------------------------------
    test_df = df.append({'기업명':corp_name, '종목코드':stock_code, '대표자명':ceo_nm, 
        '법인구분':corp_cls, '법인등록번호':jurir_no, '사업자등록번호':bizr_no, 
        '주소':adres, '업종코드':induty_code},ignore_index=True)
    

    중간에 XML 데이터를 변수에 넣는 과정이 이해가 안 될 수 있는데, 위 XML 에서 "<  >" 해당 부분을 찾아서 텍스트만 뽑아온다고 생각하면 쉽다. 즉, "2) XML 데이터 조회 결과" 의 XML 파일에서 기업명은 <corp_name> 삼성전자(주)</corp_name>로 되어 있으니 XML 파일에서 <corp_name>을 찾아서 거기서 텍스트만 뽑아오는 명령어가 아래처럼 되는 것이다. 

    soup.find("corp_name").text

    corp_name 이라는 변수에 넣어준 것이 아래와 같은 명령어이다. 

    corp_name = soup.find("corp_name").text

    3. 가공된 데이터를 엑셀로 내보내기

      DataFrame 형식으로 데이터를 만들었다면 엑셀로 내보내는 것은 어렵지 않다. 아래처럼 경로만 잘 지정해서 "to_excel" 해주면 된다. 아래는 "C:/Users/admin/Desktop" 이라는 경로에 "test.xlsx"라는 엑셀 파일로 만드는 코드 예시이다. 물론 위에서 test_df라는 변수에 DataFrame을 저장했으므로 test_df를 엑셀로 만들어 주어야 한다. 

    # 엑셀로 데이터 보내기-----------------------------------------------------------------
    test_df.to_excel('C:/Users/admin/Desktop/test.xlsx')
    반응형
Designed by Tistory.