[Python] 금융 공공데이터 활용 1

Park.giyoun·2021년 7월 6일
1
post-thumbnail

2021-07-06 화. D-34

# Preview


  • 군 입대 1달 남은 사람이 이런거 하고 있는게 참.. 내가 생각해도 미친게 분명하다..

-- GitHub 링크 --


배경

기업분석을 하는 팀플에서, 기업 하나의 재무정보를 수작업으로 찾아 분석을 하는 것이 힘들었다.
또한, 현재 나는 주식투자도 하고 있는 중이라 여러기업의 재무정보를 파악하는 것이 중요했다.


여러 기업의 데이터를 수작업으로 찾는다?
우리같은 공대생들은 이런거 못참는다. ^^

바로 파이썬으로 자동화 하기로 마음먹었다.


tool

  1. Selenium
$ pip install selenium
  1. Chrome driver
    (크롬 버전 확인 후 직접 다운 후 workspace에 exe파일 붙여넣기)

  2. "재무정보조회서비스"
    Data.go.kr (공공데이터)

  3. xmltodict

$ pip install xmltodict


데이터 준비

  • 데이터 형식: XML+JSON인데, 그냥 XML로 보는게 맞는거 같다.

  • 공공데이터를 통해 기업의 재무정보를 가져오기 위해서는, 기업의 "법인등록번호"가 필요하다.
    이는 기업 사이트에서 볼 수 있는 "사업자등록번호"와는 다르다.
    추후에 기업 이름만 검색해도 되도록 만들 계획이다. 따라서 전자 공시 사이트에 자동으로 접속하여 검색한 뒤, 법인등록번호를 가져올 수 있도록 만들 것이다.


테스트 계획

  1. 기업 이름 입력
  2. dart.fss.or.kr에 자동 검색 후 "법인등록번호" 가져오기
  3. 공공데이터로 접근해서 회계연도 2020년의 손익계산서와 재무상태표 데이터를 가져와서 출력해보기.


개발

1번, 2번 계획

[ 코드에서 생략한 부분이 있다. 자세한건 github에서... ]

from selenium import webdriver
browser = webdriver.Chrome('./chromedriver.exe')

(사실 workspace에 파일을 넣은 거라면, 괄호 안에 안 써줘도 된다.)

  1. get()함수를 통해 해당 주소로 브라우저를 실행시킨다.
  2. 검색창 태그를 id를 통해 변수에 할당한다.
  3. 검색창에 키를 입력하고, 엔터를 누르게 한다.
browser.get('http://dart.fss.or.kr/')

# 검색창 element
searchElem = browser.find_element_by_id("textCrpNm")

# 검색창 click
# searchElem.click()

# 키 값 입력(엔터치기)을 위해 Keys를 import한다.
from selenium.webdriver.common.keys import Keys

# 검색
searchElem.send_keys(corp)
searchElem.send_keys(Keys.ENTER)

이 이후에 기업링크를 클릭하고 정보를 가져와야 하는데, 이 과정에서 문제가 발생했다.
문제가 없어 보였으나, 랜덤하게 오류가 나는 것이다;;
(와! 오류 없다! --> 엥? 하나도 안 만졌는데 왜 오류가..?)

  • 원인

검색후에 사이트가 기업 정보를 가져오는데에 시간이 걸리는 것이다.
그래서 프로그램은 가져올 값이 없는 것으로 인식 해 버리는 것이다.

따라서 아래와 같이 import 해준 뒤, 정보가 불러질 때 까지 기다리도록 만들었다.

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 기업 리스트 조회까지 대기
try:
    # 기업 링크 클릭
    corpLink = WebDriverWait(browser, 10).until(EC.presence_of_all_elements_located((By.LINK_TEXT, corp)))
    corpLink[0].click()
finally:
    print("공시 System....")

CorpNum = ""
# 기업 정보 팝업이 될 때 까지 대기
try:
    CorpNumber = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))
    CorpNum = CorpNumber.text
finally: 
    print("정보 조회...")
    browser.quit()

xpath변수: str(xpath) & corp변수: str(기업이름)

WebDriverWait(browser, (최대 시간) ).until(EC.presence_of_element_located(태그 정보)

이 함수를 통해, 태그를 정상적으로 불러올 수 있을 때 태그 정보를 변수에 할당하도록 만들었다.


결과

전자공시시스템을 통해 삼성전자의 법인 등록번호를 가져온 결과이다.


다음 포스팅에서는, 이렇게 가져온 번호를 사용하여 기업의 재무제표들을 불러온 이야기에 대해 다루겠다. (계획 3번)
profile
HUFS 산업경영공학 & 경제학

0개의 댓글