나의 경험/커리어하이 DT 금융업무 자동화 교육

Dart API와 python 이용해 공시정보 엑셀 저장하기

LeeJaeJun 2024. 1. 20. 19:47
728x90
반응형
코드 목적

KOSPI 시장의 거래대금 상위 20개 종목에 대한 공시 정보를 크롤링하고, 결과를 엑셀 파일에 저장하는 과정을 구현한 것입니다. 주요 작업으로는 pykrx를 통한 KOSPI 데이터 수집, XML 파싱, OpenDART API를 사용한 공시 정보 수집 및 결과를 엑셀 파일에 저장합니다.

 

https://drive.google.com/file/d/1A7dBx8C66RhZWyqNetVcoM9iRmAGCD3F/view?usp=share_link

 

CORPCODE.xml

 

drive.google.com

def disclosure_information_crawling():
    import pandas as pd
    import datetime
    from pykrx import stock

    today = datetime.datetime.today() # 오늘 날짜

    today_str = datetime.datetime.strftime(today, '%Y%m%d') # 오늘 날짜를 'YYYYMMDD' 형식의 문자열로 변환

    today_table_ = stock.get_market_ohlcv(today_str, market="KOSPI") # 오늘 날짜의 KOSPI 시장 OHLCV 데이터

    today_table_ = today_table_.sort_values(by=['거래대금'], ascending=False) #'거래대금' 기준으로 내림차순 정렬

    tickers_best20 = today_table_.index[:20] # 거래대금이 높은 상위 20개 종목의 티커를 'tickers_best20'에 저장

    from xml.etree.ElementTree import parse
    # 'CORPCODE.xml' 파일을 파싱하고 XML 트리의 루트 저장
    xmlTree = parse('CORPCODE.xml')
    root = xmlTree.getroot()
    
    temp_list = root.findall('list') # XML 트리에서 'list' 태그를 모두 찾아 'temp_list'에 저장

    list_for_df = []
    # 'temp_list'의 각 항목에서 필요한 정보를 추출하여 'list_for_df'에 추가
    for i in range(0, len(temp_list)):
        temp = temp_list[i]
        list_for_df.append([temp.findtext('corp_code'), temp.findtext('corp_name'), 
                            temp.findtext('stock_code'), temp.findtext('modify_date')])

    # 'list_for_df'로부터 DataFrame 'corp_code_df'를 생성
    corp_code_df = pd.DataFrame(list_for_df, columns=['corp_code', 'corp_name', 'stock_code', 'modify_date'])

    # 'corp_code_df'에서 'tickers_best20'에 해당하는 행만 추출하여 'final_list'에 저장
    final_list = corp_code_df[corp_code_df['stock_code'].isin(tickers_best20)]

    # requests와 BeautifulSoup 라이브러리를 임포트
    import requests
    from bs4 import BeautifulSoup

    # OpenDART API를 사용하기 위한 키와 URL을 
    key = "이곳에 본인이 발급받은 인증키를 넣으세요"
    url = "https://opendart.fss.or.kr/api/list.xml"

	# 결과를 저장할 DataFrame 'result'를 초기화
    result = pd.DataFrame(columns=['종목명', '거래대금', '공시제목', '공시링크'])
    

    cnt = 1

    for i in final_list.index:
    	# OpenDART API에 전달할 파라미터를 설정
        params = {'crtfc_key': key, 'bgn_de': today_str, 'end_de': today_str, 
                  'page_no': 1, 'page_count': 100, 'corp_code': final_list.loc[i, 'corp_code']}
        

        response = requests.get(url, params=params).content.decode('UTF-8') # 설정한 URL과 파라미터로 요청을 보내고 응답을 UTF-8 형식으로 디코딩\

        html = BeautifulSoup(response, 'html.parser') # 받은 응답을 HTML로 파싱

        res = html.findAll('list') # 파싱된 HTML에서 'list' 태그를 모두 찾아 'res'에 저장
	# 각 공시에 대한 정보를 'result' DataFrame에 추가
        for j in res:
            result.loc[cnt, :] = [final_list.loc[i, 'corp_name'], today_table_.loc[final_list.loc[i, 'stock_code'], '거래대금'],
                                 j.report_nm.text, "https://dart.fss.or.kr/dsaf001/main.do?rcpNo=" + j.rcept_no.text]
            cnt += 1
    

    result.set_index(keys=['종목명'], inplace=True, drop=True) # 'result' DataFrame의 인덱스를 '종목명'으로 설정
	
    # 엑셀에 저장
    import xlwings
    wb = xlwings.Book("원하는 파일명.xlsm")
    sheet = wb.sheets[0]
 
    sheet.range('A1').value = result # 엑셀 시트의 A1 셀부터 'result' 데이터를 삽입

    wb.save()
    wb.close()

 

.

728x90
반응형