(OpenAPI)DART Open API 사용법3: 기업데이터 가공 in python
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')