2020년 7월 11일 토요일

Python ZipFile 압축 해제 (Feat. Open Dart 회사코드)


개요

 Open Dart 에서 제공하는 API 중 전체 기업의 코드, 기업명을 가져오는 통해 우리나라에 등록된 기업들을 가져오고 기업들을 DB 화 해보고자 PostgreSQL 을 설치완료 하였다.

 다만 Open Dart 에서 제공하는 파일이 용량문제로 ZIP 형태로 제공하는데, python 을 통해 압축을 풀고, XML 파싱, PostgreSQL DB Insert 하는 프로그램을 개발해보고자 한다.




ZIP 파일 다운로드, 압축해제

 먼저 Open Dart API 를 통해 ZIP 파일을 전송 받는다. (심플함 그냥 GET 하면 가져옴..)
다만 이를 위해 zipfile, io 모듈 추가가 필요하다.

import requests
import json
import zipfile
import io

def getAllData():
    # Open Dart API 이용
    reqUrl = 'https://opendart.fss.or.kr/api/corpCode.xml?'
    # API 신청에서 발급받은 키 세팅
    reqUrl += 'crtfc_key=' + Constants.Global.dartApiKey

    # 응답 받은 후
    response = requests.get(reqUrl)
    # ZipFile 객체 생성
    zipFile = zipfile.ZipFile(io.BytesIO(response.content))
    # 압축 해제
    zipFile.extractall()


def main():
    getAllData()


if __name__ == '__main__':
    main()

 위의 로직을 실행 시키면 프로젝트 폴더에 다음과 같은 파일이 생성된다.


 해당 파일은 XML 형태로 되어있으며, 상장/비상장을 막론하고 모든 국내 기업 리스트가 나열되어있다. 기업 수는 8만개가 넘으며, 용량도 XML 파일임에도 15MB 로 꽤나 큰편이다. 그만큼 우리나라에 회사가 엄청나게 많다는 거에 새삼스레 놀랬다.

회사코드 확인하기

 CORPCODE XML 파일을 확인하면 다음과 같은 형태의 구조로 되어있다. 다만 모든 기업이 유가증권(코스피) 와 코스닥에 상장해 있는게 아니니 [stock_code] 컬럼은 비어있을 수 있다.
 일단 이중에 stock_code가 있는 기업(상장기업)만 DB에 넣어서 관리 해보고자 한다.

<?xml version="1.0" encoding="UTF-8"?>
<result>
    <list>
        <corp_code>00126380</corp_code>
        <corp_name>삼성전자</corp_name>
        <stock_code>005930</stock_code>
        <modify_date>20191209</modify_date>
    </list>
    ...
</result>


마치며

 python 을 공부하며 매번 놀라는 일은 날코딩을 아직까지 해 본 적이 없다. (아마 앞으로도 다룰 단순한 기능들에 대해 날코딩을 할 일은 없을 것으로 보인다.)
 이미 널리 쓰이는 모듈들만 잘 활요해도 충분히 원하는 기능을 만들 수 있다는 점에서 더더욱 매력적이다. 다음번엔 XML 파싱과 DB(PostgreSQL) 연결을 해봐야지.



댓글 없음:

댓글 쓰기

Recent Posts