Python(파이썬)+Accounting(회계)

전자공시 OPENDART api with Python (3)_모든회사_기업개황 수집

prograccount 2020. 3. 13. 01:14

이 글은 아래의 글을 다음으로 합니다.

 

전자공시 OPENDART api 활용 (2)_공시정보 > 기업개황

이 글은 아래의 글을 다음으로 합니다. 전자공시 OPENDART api 활용 (1)_공시정보 > 고유번호 2020년 1월 21일부터 금융감독원에서 제공하는 oepndart 서비스를 사용할 수 있게 되었다. 기존에도 이와 비슷한 기능..

progr-account.tistory.com

이전 글에서는 기업개황 정보를 검색하는 방법을 알아보았습니다.

하지만 지금까지 만든 함수로는 대량의 기업정보선택적으로 수집하기 어렵습니다.

 

왜냐하면

공시정보 > 기업개황 에서는 기업의 다음과 같이 많은 정보를 얻을 수 있습니다.

[정식명칭, 영문명칭, 종목명(상장사) 또는 약식명칭(기타법인), 상장회사인 경우 주식의 종목코드, 대표자명, 법인구분, 법인등록번호, 사업자등록번호, 주소, 홈페이지, IR홈페이지, 전화번호, 팩스번호, 업종코드, 설립일(YYYYMMDD), 결산월]

하지만, 공시정보 > 고유번호 에서처럼 모든 기업의 데이터를 zip으로 반환해 주지 않고 json 또는 xml로 반환합니다.

 

그런데 웃긴건

공시정보 > 고유번호는 다음과 같이 기업에 대한 소량의 정보만을 얻을 수 있습니다.

[고유번호, 회사명, 대표자명, 종목코드, 최근변경일자]

 

즉, 공시정보 > 기업개황에서 모든 기업의 고유번호를 하나하나 입력해야만 원하는 기업의 데이터를 얻을 수 있습니다.

그래서 저는 이 귀찮음을 해결하고자 76661개의 기업을 모두 수집해 파일 형태로 저장하기로 했습니다.

 

모든 기업의 기업개황을 담고있는 파일을 사용하면

전자공시 OPENDART에서 별도로 제공해 주지 않는

법인구분별, 업종코드별로 기업의 정보를 검색할 수 있습니다.

 

하지만 파일을 수시로 업데이트 해주지 않으면 정보가 정확하지 않습니다.

이 글을 통해 기업개황정보를 수집한다면 적어도 연말, 연초에는 파일을 업데이트 하시길 바랍니다.

 

개발환경

  • OS : windows10
  • 사용언어 : python
  • python을 실행하고 library를 다운받을줄 안다면 따라올 수 있습니다.
  • 기초적인 회계지식이 있어야 할지 모릅니다.

 


1. 회사고유번호 불러오기(load 또는 read)

### xml 모듈 import
import xml.etree.ElementTree as ET

### xml 파일 읽기
tree = ET.parse('CORPCODE.xml')
root = tree.getroot()

아래의 글이 선행되어야 합니다.

 

전자공시 OPENDART api 활용 (1)_공시정보 > 고유번호

2020년 1월 21일부터 금융감독원에서 제공하는 oepndart 서비스를 사용할 수 있게 되었다. 기존에도 이와 비슷한 기능을 가진 서비스가 전자공시시스템 오픈 API에서 활용 가능했다. 전자공시시스템에서 제공하는..

progr-account.tistory.com

'전자공시 OPENDART api 활용'의 첫 글에서 저장한 고유번호 xml 파일을 읽어옵니다.


2. 기업 고유번호 모음 list 만들기

### 기업 고유번호 모음 list 만들기
code_list=[]
for country in root.iter("corp_code"):
    code_list.append(country.text)

앞서 설명한바와 같이 '기업개황'은 '기업고유번호'를 하나 입력하면 하나의 '기업개황'정보를을 돌려줍니다.

따라서 모든 기업의 고유번호가 담긴 list를 만들어 하나하나 기업개황 정보를 검색할 것입니다.


3. 기업개황 검색 함수 만들기

좀 지* 맞습니다.

검색하고 저장해야할 기업의 개수는 76661개 인데

하나의 인증키로 하루에 검색가능한 횟수는 10,000번으로 제한됩니다.

따라서 데이터를 수집하고자 한다면 8일에 걸쳐 데이터를 수집하던 8개의 인증키를 구하던 해야합니다.

 

다행히도 인증키를 발급받는데는 본인인증 필요없이 이메일만 있으면 되어서

일회용 이메일을 사용해 인증키를 추가로 발급받았습니다.

### 기업개황 검색 함수 만들기
def load_data(corp_code):
    
    ### 본인의 인증키 입력
    crtfc_key_1 = "본인이 발급받은 인증키"
    crtfc_key_2 = '본인이 발급받은 인증키'
    crtfc_key_3 = "본인이 발급받은 인증키"
    crtfc_key_4 = "본인이 발급받은 인증키"
    crtfc_key_5 = "본인이 발급받은 인증키"
    crtfc_key_6 = "본인이 발급받은 인증키"
    crtfc_key_7 = "본인이 발급받은 인증키"
    crtfc_key_8 = "본인이 발급받은 인증키"
    crtfc_key_9 = "본인이 발급받은 인증키"
    
    ### 기업개황 요청 url
    url = 'https://opendart.fss.or.kr/api/company.json?crtfc_key='+crtfc_key_1+'&corp_code='+corp_code

    ### HTTP 요청
    r = requests.get(url)

    ### 요청한 데이터는 json형태이기 때문에 json으로 읽어줍니다.
    company_data = r.json()

    ### 기업개황을 요청했을 때 기업개황에 대한 자료를 반환합니다.
    return company_data

crtfc_key_*

(하루 내의)검색 횟수가 10,000이면 다음 인증키로 변경해 주어야 합니다.

이것또한 자동화 할수 있겠지만 자동화 함수를 만드는 시간을 고려한다면 효용이 없어 직접 바꾸기로 했습니다.

 

기업개항 요청 url ex)

https://opendart.fss.or.kr/api/company.json?crtfc_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&corp_code=00356370

 

함수를 실행하면 요청한 데이터를 json 형태로 받아와 출력하도록 합니다.


4. 반복문을 사용하여 데이터 수집

### 데이터를 담아둘 list 생성
company_list_1 = [] # company_list_1 0 ~ 9,000 
company_list_2 = [] # company_list_2 9,000 ~ 18,000 
company_list_3 = [] # company_list_3 18,000 ~ 27,000 
company_list_4 = [] # company_list_4 27,000 ~ 36,000 
company_list_5 = [] # company_list_5 36,000 ~ 45,000 
company_list_6 = [] # company_list_6 45,000 ~ 54,000 
company_list_7 = [] # company_list_7 54,000 ~ 63,000 
company_list_8 = [] # company_list_8 63,000 ~ 72,000 
company_list_9 = [] # company_list_9 72,000 ~ 76,661

### 반본문 실행
for corp_code in code_list[0:9000]:
    company_dict = load_data(corp_code)
    
    ### list 변경할것
    company_list_1.append(company_dict)

 

하나의 인증키당 10,000을 검색할 수 있지만

계산의 편의를 위해서 9,000번씩 검색하도록 하였습니다.

 

for 반복문

for문을 사용해 모든기업의 고유번호가 담긴 code_list의 요소 하나하나를 load_data 함수로 실행하여

기업개황 정보를 불러와 compnay_list_*에 담아둡니다.


5. 수집한 데이터 저장

### pickle 모듈 import
import pickle

### pickle 모듈을 통해 list 저장
with open('company_1.txt','wb') as f:
       pickle.dump(company_list_1,f

4.번을 통해 수집한 compnay_list*를 pickle 모듈을 통해서 저장합니다.


6. 기업개황 통합

### 기업개황 통합하기
# 모든 기업개황이 담길 list
total_company_list=[]

# for문을 이용해 통합
for num in range(1,10):
    file_name = 'company_'+str(num)+'.txt'
    with open(file_name,'rb') as f:
        data=pickle.load(f)
        total_company_list=total_company_list + data
        
 # 통합 list 저장
 with open('total_company_list.txt','wb') as f:
       pickle.dump(total_company_list,f)

4,5번의 과정을 통해 모든 기업개황은 9개의 파일로 나뉘어 저장되었습니다.

하나의 list로 수집했다면 이과정은 생략해도 됩니다.

하지만 시간이 오래걸리는 과정이므로 list를 나누어 기업개황 정보를 수집하길 권합니다.

9개의 파일로 나뉜 기업개황 정보를 하나의 리스트에 통합시켜 줍니다.

이후 5번과 같은 방법으로 pickle모듈을 통해 저장합니다.


7.결과물

아쉽게도 업로드는 10MB 미만인데

모든기업의 개황이 담긴 파일은 54MB라 6번의 결과물을 업로드 할 수 없었습니다.

따라서 다음과 같이 compnay_list1~9파일을 업로드 합니다.

필요하시다면 다운받아 6번의 과정을 통해 통합해 사용하시길 바랍니다.

company_1.txt
6.12MB
company_2.txt
6.16MB
company_3.txt
6.16MB
company_4.txt
6.25MB
company_5.txt
6.21MB
company_6.txt
6.20MB
company_7.txt
6.22MB
company_8.txt
6.25MB
company_9.txt
3.26MB


전체코드

### xml 모듈 import
import xml.etree.ElementTree as ET

### xml 파일 읽기
tree = ET.parse('CORPCODE.xml')
root = tree.getroot()



### 기업 고유번호 모음 list 만들기
code_list=[]
for country in root.iter("corp_code"):
    code_list.append(country.text)



### 기업개황 검색 함수 만들기
def load_data(corp_code):
    
    ### 본인의 인증키 입력
    crtfc_key_1 = "본인이 발급받은 인증키"
    crtfc_key_2 = '본인이 발급받은 인증키'
    crtfc_key_3 = "본인이 발급받은 인증키"
    crtfc_key_4 = "본인이 발급받은 인증키"
    crtfc_key_5 = "본인이 발급받은 인증키"
    crtfc_key_6 = "본인이 발급받은 인증키"
    crtfc_key_7 = "본인이 발급받은 인증키"
    crtfc_key_8 = "본인이 발급받은 인증키"
    crtfc_key_9 = "본인이 발급받은 인증키"
    
    ### 기업개황 요청 url
    url = 'https://opendart.fss.or.kr/api/company.json?crtfc_key='+crtfc_key_1+'&corp_code='+corp_code

    ### HTTP 요청
    r = requests.get(url)

    ### 요청한 데이터는 json형태이기 때문에 json으로 읽어줍니다.
    company_data = r.json()

    ### 기업개황을 요청했을 때 기업개황에 대한 자료를 반환합니다.
    return company_data
    
    
    
### 데이터를 담아둘 list 생성
company_list_1 = [] # company_list_1 0 ~ 9,000 
company_list_2 = [] # company_list_2 9,000 ~ 18,000 
company_list_3 = [] # company_list_3 18,000 ~ 27,000 
company_list_4 = [] # company_list_4 27,000 ~ 36,000 
company_list_5 = [] # company_list_5 36,000 ~ 45,000 
company_list_6 = [] # company_list_6 45,000 ~ 54,000 
company_list_7 = [] # company_list_7 54,000 ~ 63,000 
company_list_8 = [] # company_list_8 63,000 ~ 72,000 
company_list_9 = [] # company_list_9 72,000 ~ 76,661

### 반본문 실행
for corp_code in code_list[0:9000]:
    company_dict = load_data(corp_code)
    
    ### list 변경할것
    company_list_1.append(company_dict)
    
    
    
### pickle 모듈 import
import pickle

### pickle 모듈을 통해 list 저장
with open('company_1.txt','wb') as f:
       pickle.dump(company_list_1,f



### 기업개황 통합하기
# 모든 기업개황이 담길 list
total_company_list=[]

# for문을 이용해 통합
for num in range(1,10):
    file_name = 'company_'+str(num)+'.txt'
    with open(file_name,'rb') as f:
        data=pickle.load(f)
        total_company_list=total_company_list + data
        
 # 통합 list 저장
 with open('total_company_list.txt','wb') as f:
       pickle.dump(total_company_list,f)

 

 


앞으로는...

수집한 모든 기업의 개황을 통해 기업들간의 재무제표를 비교해 보려 합니다.

하지만 전자공시 OPNEDART에서는 상장기업의 재무제표 정보만을 제공하기 때문에

정확히는 상장회사의 재무제표를 비교, 분석해보려 고합니다.

 

 



[수정]

 

원하시는분들이 많으셔서 기업개황 csv 파일로 변환하여 업로드 합니다.

기존의 txt 파일이 한글로 표기되지 않는 이유는 pikcle 라이브러리를 사용해 저장하였는데 데이터 저장을 위해 txt 파일을 사용하였을 뿐 txt가 한글로 저장되지 않았기 때문입니다.

 

시간이 흐른 지금 생각해보면 저장을 왜 구지 pickle로 했나 싶네요

json이나 다른 저장 방법을 사용했을텐데...

저도 비전공자에 취미로 하는것 뿐이지만

python을 잘 활용하시지 못하는 분들을 위해서..

툭...................................................

기업개황.csv
0.79MB