주식 퀀트 투자를 위한 다트 전자공시시스템 크롤링 방법

주식 퀀트 투자를 위한 다트 전자공시시스템 크롤링 방법

KissCuseMe
2025-03-11
150

다트 전자공시시스템에서 재무제표 데이터를 크롤링하는 방법을 단계별로 설명드리겠습니다. 파이썬의 requests, BeautifulSoup, pandas 라이브러리를 사용합니다. 단, 실제 사용 시 웹사이트 구조 변경에 유의하시고, 과도한 요청은 서버에 부하를 줄 수 있으므로 주의가 필요합니다.


1. 필요한 라이브러리 설치

pip install requests beautifulsoup4 pandas openpyxl

2. 다트 공시 검색 및 재무제표 크롤링 예제

import requests
from bs4 import BeautifulSoup
import pandas as pd
from urllib.parse import urljoin

# Search Criteria (e.g., Samsung Electronics (005930) Annual Report)
COMPANY_CODE = "005930"  # Stock Code
START_DATE = "20230101"  # Search Start Date (YYYYMMDD)
END_DATE = "20231231"    # Search End Date (YYYYMMDD)
REPORT_TYPE = "A001"     # A001: Annual Report, A002: Semi-Annual Report, A003: Quarterly Report

# DART Disclosure Search URL
SEARCH_URL = "http://dart.fss.or.kr/dsab001/search.ax"

def get_report_list():
    """Function to fetch the list of DART disclosure reports"""
    params = {
        "currentPage": 1,
        "maxResults": 10,
        "businessCode": COMPANY_CODE,
        "startDate": START_DATE,
        "endDate": END_DATE,
        "reportName": REPORT_TYPE
    }
    response = requests.get(SEARCH_URL, params=params)
    soup = BeautifulSoup(response.text, 'html.parser')
    return soup.select(".table_list tr")[1:]  # Extract rows excluding the header

def extract_excel_url(report_url):
    """Function to extract the Excel file URL from the report page"""
    response = requests.get(report_url)
    soup = BeautifulSoup(response.text, 'html.parser')
    excel_link = soup.select_one("a[href*='download.xbrl']")
    if excel_link:
        return urljoin(report_url, excel_link['href'])
    return None

def download_excel(url):
    """Function to download the Excel file and convert it into a DataFrame"""
    response = requests.get(url)
    with open("temp.xlsx", "wb") as f:
        f.write(response.content)
    return pd.read_excel("temp.xlsx", engine='openpyxl')

# Main Execution
if __name__ == "__main__":
    reports = get_report_list()
    for idx, report in enumerate(reports[:3]):  # Process up to 3 reports
        # Extract report title and link
        title = report.select_one("td:nth-child(3) a").text.strip()
        report_url = urljoin(SEARCH_URL, report.select_one("td:nth-child(3) a")['href'])
        
        print(f"[{idx+1}] Extracting data from {title}...")
        
        # Extract Excel file URL and download
        excel_url = extract_excel_url(report_url)
        if excel_url:
            df = download_excel(excel_url)
            print(df.head())  # Check the data
        else:
            print("Excel file not found.")

3. 코드 설명

  • 검색 조건 설정 :
    • COMPANY_CODE: 종목코드 (예: 삼성전자=005930)
    • REPORT_TYPE: A001(연간), A002(반기), A003(분기)
    • 날짜 범위는 START_DATE와 END_DATE로 제한합니다.
  • 보고서 목록 크롤링 :
    • 다트 공시 검색 API를 호출해 보고서 목록을 가져옵니다.
    • BeautifulSoup로 HTML 파싱 후 보고서 제목과 링크를 추출합니다.
  • Excel 파일 추출 :
    • 각 보고서 페이지에서 XBRL 형식의 Excel 파일 링크를 찾아 다운로드합니다.
    • pandas로 Excel 파일을 읽어 DataFrame으로 변환합니다.
  • 주의사항
    • 동적 콘텐츠 처리 : 일부 페이지는 JavaScript로 동적으로 로드될 수 있습니다. 이 경 - 우 Selenium을 사용해야 할 수 있습니다.
    • 데이터 정합성 : 회사별로 Excel 파일 구조가 다를 수 있으므로, 컬럼 매핑 로직을 추가해야 합니다.
    • 법적 제한 : 웹 크롤링 시 다트 이용약관 을 준수해야 합니다.

이 코드를 기반으로 추가적인 데이터 전처리 및 퀀트 분석 로직을 구현할 수 있습니다.

주식
퀀트
투자
크롤링
다트

0

목차

  • 1. 필요한 라이브러리 설치
  • 2. 다트 공시 검색 및 재무제표 크롤링 예제
  • 3. 코드 설명
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

이용약관개인정보 처리방침문의
© 2025
미리 알았다면 좋았을 텐데
All rights reserved.