DART 전자공시 시스템에서 기업의 공시 보고서를 파이썬 셀레늄 (Python Selenium)을 이용하여 접근하는 방법에 대해서 정리해보았다. Selenium을 이용하여 기업의 가장 최근 정기보고서를 클릭한 뒤 사업의 내용까지 클릭하는 방법이다. 어차피 사업 내용은 내 눈으로 읽어봐야하는 부분이기 때문에 크롤링은 하지 않고 창을 띄워서 클릭하는 것까지만 구현한다.
개요
기업의 기본적인 분석을 할 때 기초가 되는 것이 바로 기업의 공시이다.
분기보고서나, 반기보고서, 혹은 사업보고서를 읽다보면 우선 그 회사의 손익계산서 및 재무상태표가 나온다.
또한 그 회사가 영위하고 있는 주요 사업에 대한 정보와 계열회사 출자현황, 자회사 현황 등 많은 것들을 알 수 있다.
하지만 여러회사에 대해서 공시 보고서를 읽을 때 DART 홈페이지에 직접 들어가서 읽는게 굉장히 번거로운 경우가 많다.
가장 큰 문제는 검색 시스템이 클릭을 굉장히 여러번 해야 작동하게 되어있다는 점이다.
그래서 그 시간이나마 최대한 줄이기 위해 Selenium을 이용하기로 하였다.
필요한 Packages
Selenium이 필요하다
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
Selenium WebDriver 실행
우선 Selenium을 작동시킨다.
options = webdriver.ChromeOptions()
options.add_argument('window-size=1920x1080')
options.add_argument("disable-gpu")
driver = webdriver.Chrome(service = Service(ChromeDriverManager().install()), options=options)
driver.implicitly_wait(3)
XPATH 알아내기
Selenium 으로 켜진 Chrome 창 안에서 원하는 요소에 접근하기 위해서 요소별 XPATH를 알아내야한다.
크롬을 키고 F12나 설정에서 개발자 도구를 누르면 다음 창이 뜬다.
Ctrl + Shift + I 로도 위와 같이 개발자 도구로 접근할 수 있다.
그 상태에서 Ctrl + Shift + C를 누르고 XPATH를 알고 싶은 요소를 클릭하면 우측 개발자도구 Elements에서 해당 요소로 이동하게 된다.
우클릭해서 XPATH를 복사할 수 있다.
공시 보고서 선택하기
우선 DART 기업 공시 사이트로 이동해야한다.
기업 코드는 네이버 증권 등에서 조회해서 알아내자.
code = 000000 #<-- 기업 코드 삽입
url = f"https://dart.fss.or.kr/html/search/SearchCompany_M2.html?textCrpNM={code}"
driver.get(url)
이렇게 되면 해당기업 DART 공시 사이트로 이동한다.
이 상태에서 정기공시 버튼을 클릭한뒤, 검색하고, 가장 최근의 보고서를 클릭하자.
def xp(xpath): ## XPATH로 element 찾아서 return하는 함수, 편의상 제작함
return driver.find_element(by=By.XPATH, value = xpath)
xp('//*[@id="li_01"]/label/img').click() #정기공시
xp('//*[@id="searchForm"]/div/div[1]/ul/li[1]/div/a').click() #검색
time.sleep(1)
xp('//*[@id="tbody"]/tr[1]/td[3]/a').click() #첫번째 보고서 검색
중간에 검색버튼을 누르고 반응이 올때까지 약간의 시간이 필요해서 time.sleep을 넣어주었다.
이제 새로운 창으로 공시 보고서가 열리므로 새로 열린창으로 넘어가야한다.
driver.switch_to.window(driver.window_handles[1])
공시 보고서 좌측의 목차에서 "사업" 내용이 들어간 부분을 찾아서, 거기를 클릭하는 코드를 짠다.
a = xp('//*[@id="listTree"]/ul').text
b = a.split("\n")
for i in range(len(b)):
if "사업" in b[i]:
c = i
break
xp(f'//*[@id="{c+1}_anchor"]').click()
이제 사업의 내용을 확인할 수 있다.
크롤링이 필요하면 비슷한 방식으로 여기에서 내용을 받아오면 될 것이다.