2 min read

python으로 대한민국 주식데이터 받기

1995년 5월 2일부터 2023년 5월 11일 까지 주식데이터 받는 코드는 다음과 같다

대한민국 법정 공휴일과 대한민국 마지막 일은 제외해야하는 코드는 추가적으로 작성해야한다.

공휴일이 년도 마다 다를 가능성이 있어 다운로드받은 데이터에 주가 값이 없으면 그 파일은 제거하는 코드를 추가 해는 식으로 작성 할 수있다.

import datetime
import requests
import re
import urllib.parse
import os

START_DATE = datetime.date(1995, 5, 2)
END_DATE = datetime.date(2023, 5, 11)
MATA_DATA_URL = "http://data.krx.co.kr/comm/fileDn/GenerateOTP/generate.cmd"
DOWNLOAD_URL = "http://data.krx.co.kr/comm/fileDn/download_excel/download.cmd"

def create_folder(folder_path):
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)

def download_file(url, payload, save_path):
    response = requests.post(url, data=payload)
    if response.status_code == 200:
        download_response = requests.post(DOWNLOAD_URL, data={
            "code": response.content.decode('utf-8')
        })
        if download_response.status_code == 200:
            content_disposition = download_response.headers.get('Content-Disposition')
            file_name = payload["trdDd"] +".xlsx"
            with open(os.path.join(save_path, file_name), "wb") as file:
                file.write(download_response.content)
            return file_name
    else:
        return None

current_date = START_DATE
while current_date <= END_DATE:
    if current_date.weekday() < 5:  # 월요일(0)부터 금요일(4)까지만 작동
        year_folder = str(current_date.year)
        create_folder(year_folder)
        current_format = current_date.strftime("%Y%m%d")
        payload = {
            "locale": "ko_KR",
            "mktId": "ALL",
            "trdDd": current_format,
            "share": "1",
            "money": "1",
            "csvxls_isNo": "false",
            "name": "fileDown",
            "url": "dbms/MDC/STAT/standard/MDCSTAT01501"
        }
        file_name = download_file(MATA_DATA_URL, payload, year_folder)
        if file_name:
            print(f"다운로드 완료 - {file_name}")
        else:
            print(f"다운로드 실패 - {current_format}")

    current_date += datetime.timedelta(days=1)