목적

- OpenDart를 사용해 공시데이터를 조회

- OpenDart에서 Key로 사용하는 기업코드(corp_code)를 받아와서 Data Frame으로 저장

- 추후 해당 기업코드로 다양한 OpenDart API 활용

 

 

 

기본적인 라이브러리 들을 Import합니다

import pandas as pd
import requests
import xml.etree.ElementTree as et
from io import BytesIO
from zipfile import ZipFile
import urllib3

 

 

해당 구조로 하는 이유는 다른 API 접속 프로그램을 만들때 url_json과 params 부분만 수정 및 추가해주면 되기 때문입니다.

 

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) #워닝 메시지 미출력


#[1]  고유번호조회
### OPENDART 개발 가이드
url_json = 'https://opendart.fss.or.kr/api/corpCode.xml'
api_key = '발급받은APIKey'

params = {
    'crtfc_key': api_key,
}

 

 

Zipfile형태는 file로 로드한 뒤에 읽어내야 합니다.

 

아래처럼 requests로 불러온뒤 XML을 다운받은 후 string으로 읽습니다.

# OpenDART에서 Zipfile 받아와 객체에 저장하기
u = requests.get(url_json, params=params,verify=False)
zipfile_bytes = u.content
zipfile_obj = ZipFile(BytesIO(zipfile_bytes))

# 압축을 풀어서 XML File을 string으로 담기
xmlfile_objs = {name: zipfile_obj.read(name) for name in zipfile_obj.namelist()}
xml_str = xmlfile_objs['CORPCODE.xml'].decode('utf-8')

 

 

읽어서 Dataframe에 담는 부분입니다.

반복문을 사용해 읽어냅니다.


# XML String을 가져와서 DataFrame에 담기
xroot = et.fromstring(xml_str)

df_cols = ["corp_code", "corp_name", "stock_code", "modify_date"]
rows = []

for node in xroot: 
    res = []
    for el in df_cols[0:]: 
        if node is not None and node.find(el) is not None:
            res.append(node.find(el).text)
        else: 
            res.append(None)
    rows.append({df_cols[i]: res[i] 
                  for i, _ in enumerate(df_cols)})

df_cor = pd.DataFrame(rows, columns=df_cols)

 

 

아래처럼 잘 들어오는것을 확인할 수 있습니다.

반응형

+ Recent posts