Project/주식 자동화 프로그램 만들기

Dart-FSS에서 공시정보를 openpyxl로 excel파일로 옮겨보기

냥냥냥냥냥냥 2022. 1. 30. 15:05

크롤링(crawling) ? 

크롤링(crawling) 혹은 스크레이핑(scraping)은 웹페이지를 그대로 가져와서 거기서 데이터를 추출해 내는 행위다. 

 

오늘 우리가 해볼 것은 Dart-FSS에서 공시정보를 가져와서 excel 파일로 옮겨보는 것을 해보려고 합니다

그러기 위해서는 파이썬 코드와 엑셀 파일을 어떻게 조작 가능한지 먼저 알아야 합니다

파이썬으로 엑셀을 조작하기 위한 모듈은 여러 가지가 있습니다(openpyxl, pandas 등등)

이번에는 openpyxl를 사용해 보도록 하겠습니다

 

 

1) Workbook 생성 및 WorkSheet active

 

wb = openpyxl.Workbook()
ws = wb.active

ws가 우리가 사용할 worksheet가 됩니다 (엑셀에서 sheet1, sheet2로 표현되어 있는 것들)

 

 

2) cell에 해당하는 값 삽입

 

엑셀 내의 네모 한 칸 한 칸을 cell이라고 지칭하며, openpyxl 내에 cell api를 확인해보면 아래와 같습니다

def cell(self, row, column, value=None):
    """
    Returns a cell object based on the given coordinates.

    Usage: cell(row=15, column=1, value=5)

    Calling `cell` creates cells in memory when they
    are first accessed.

    :param row: row index of the cell (e.g. 4)
    :type row: int

    :param column: column index of the cell (e.g. 3)
    :type column: int

    :param value: value of the cell (e.g. 5)
    :type value: numeric or time or string or bool or none

    :rtype: openpyxl.cell.cell.Cell
    """

단, row와 col은 반드시 1보다 커야합니다 (엑셀에서 보면 A1 cell의 row가 1, col이 1입니다)

 

ws.cell(row=row, column=col).value = 'A'

 

 

 

active 시킨 worksheet ws에

ws.cell(행, 열).값 = 원하는 값 삽입 형식으로 각각의 cell에 입력을 할 수 있게 되는 것입니다

 

3) WorkBook 저장

 

원하는 file titile name으로 저장을 해줍니다

단, 여기서 확장자는 xlsx를 사용해야함 (엑셀 형식의 확장자 사용 필요합니다)

titlename = "기업분석.xlsx"
wb.save(titlename)

 

Dart-FSS에서 공시정보를 가져오는 api는 아래 사이트에서 참조를 하였습니다

https://dart-fss.readthedocs.io/en/latest/dart_search.html

 

 

 

아래는 코드 부분입니다

import dart_fss as dart
import openpyxl


find_corp_name = '삼성전자'


def dart_account():
    api_key = '' #본인의 api_key 입력
    dart.set_api_key(api_key)


def dart_corp_list(inputname):
    dart_account()
    crp_list = dart.corp.get_corp_list()
    corp = crp_list.find_by_corp_name(inputname, True)[0]
    reports = corp.search_filings('20190301', '20190531')
    reportsDict = reports.to_dict()
    return reportsDict


def make_excel(reportsDict):
    titlename = f"{inputname}기업분석.xlsx"
    wb = openpyxl.Workbook()
    wb.save(titlename)
    ws = wb.active
    totalpage = reportsDict.get('total_page')
    reportListDict = reportsDict.get('report_list')
    # debugging 을 위한 로그들
    # print(f"reportDict= {reportsDict}")
    # print(f"reportListDict[0].keys() = {reportListDict[0].keys()}")
    number = 1
    for i in reportListDict[0].keys():
        # debugging 을 위한 로그들
        # print(f"key = {i}")
        ws.cell(3, number).value = i
        number = number + 1
    for i in range(1, totalpage + 1):
        number = 1
        for j in reportListDict[i].values():
            # debugging 을 위한 로그들
            # print(f"page, value  = {i} , {j}")
            ws.cell((3 + i), number).value = j
            number = number + 1
    wb.save(titlename)


if __name__ == '__main__':
    print('검색 하고 싶은 기업을 입력해주세요')
    inputname = input()
    print(inputname)
    make_excel(dart_corp_list(inputname))

 

연도는 제가 임의적으로 20190301 ~ 20190531 기간 내로 강제로 입력을 해둔 상황입니다