๐Ÿ— ์žฌ๋ฌด์ œํ‘œ ๊ฐ€๊ณต ์ž๋™ํ™”๐Ÿค– - 1

์†Œ๊ฐœ

ํšŒ์‚ฌ์—์„œ ๋งค๋ถ„๊ธฐ๋งˆ๋‹ค ๋™์—…๊ณ„ 10๊ฐœ์‚ฌ์˜ ์žฌ๋ฌด์ œํ‘œ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ ์ˆซ์ž๋งˆ๋‹ค ์ด๋Ÿฐ ์ •๋ณด์™€ ํ•จ๊ป˜ ์—ด์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค.

'์ข…๊ทผ๋‹น / 2024๋…„ 1๋ถ„๊ธฐ / ์†์ต๊ณ„์‚ฐ์„œ / ๋งค์ถœ / 100,000'

์ด๋ ‡๊ฒŒ ์ •๋ณด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ์—‘์…€ ๋ณด๊ณ ์„œ ๋งŒ๋“ค ๋•Œ ์†์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์†์œผ๋กœ ์ผ์ผํžˆ ํ•˜๋Š” ๊ฑด ๋ง์ด ์•ˆ๋˜๊ณ  ์—‘์…€ ํ•จ์ˆ˜๋ฅผ ์ž˜ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋…ธ๊ฐ€๋‹ค๊ฐ€ ๋„ˆ๋ฌด ์‹ฌํ•˜๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋ฅผ ์ž๋™ํ™”ํ•˜๊ธฐ๋กœ ํ•œ๋‹ค.

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ํ•œ ๊ฐœ ํšŒ์‚ฌ์˜ ํ•œ ๊ฐœ ๊ธฐ๊ฐ„์— ๋Œ€ํ•ด์„œ ์—‘์…€์„ ๋‹ค์šด ๋ฐ›๋Š” ๊ฑธ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค.

ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•ด N8N์—์„œ ์ž‘์—…ํ•œ๋‹ค.

ํšŒ์‚ฌ ๋งค๋ถ„๊ธฐ ๋งˆ๋‹ค, ๊ทธ ์ค‘๊ฐ„์— ๋™์—…๊ณ„ 10๊ฐœ์‚ฌ์˜ ์žฌ๋ฌด์ œํ‘œ๋ฅผ ๋ฐ›์•„์„œ ๊ฐ€๊ณตํ•˜์—ฌ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

์ง„ํ–‰ ๋ฐฉ๋ฒ•

๋จผ์ง€ colab์—์„œ ์ด๋ฏธ ์งœ๋‘” DART API ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

 !pip install dart-fss
import dart_fss as dart

# Open DART API KEY ์„ค์ •
api_key='USER_API_KEY'
dart.set_api_key(api_key=api_key)

# DART ์— ๊ณต์‹œ๋œ ํšŒ์‚ฌ ๋ฆฌ์ŠคํŠธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
corp_list = dart.get_corp_list()

ckd = corp_list.find_by_corp_name('์ข…๊ทผ๋‹น', exactly=True)[0]
# 2023๋…„๋ถ€ํ„ฐ ์—ฐ๊ฐ„ ์—ฐ๊ฒฐ์žฌ๋ฌด์ œํ‘œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
ckd_fs = ckd.extract_fs(bgn_de='20240101',separate=True,report_tp=['annual'])
# ์žฌ๋ฌด์ œํ‘œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์—‘์…€ํŒŒ์ผ๋กœ ์ €์žฅ ( ๊ธฐ๋ณธ์ €์žฅ์œ„์น˜: ์‹คํ–‰ํด๋”/fsdata )
ckd_fs.save('ckd1.xlsx')

์ด๋Œ€๋กœ ํ•ด๋„ ๋์ง€๋งŒ, n8n์„ ์ฒ˜์Œ ์จ๋ณด๊ธฐ๋„ ํ•˜๊ณ  ๊ณต๋ถ€ํ•  ๊ฒธ n8n์—์„œ ํšŒ์‚ฌ๋ช…, ๊ธฐ๊ฐ„, ์ •๋ณด๋“ฑ์„ ๋ถˆ๋Ÿฌ์™€๋ณด์ž. ๊ทธ๋Ÿฐ๋ฐ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ธฐ์—…์ •๋ณด ๋ง๊ณ  ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ ์„œ ํ…Œ์ŠคํŠธ ํ•˜๋ฉด์„œ ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

Google Docs์—์„œ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ

edit fields์—๋Š” a=1, b=2 ๊ฐ’์„ ๋ณด๋‚ด์ค€๋‹ค.

์™œ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ google drive๋กœ ์˜ฌ๋ฆฌ๋ ค๋ฉด Convert to File๋กœ json ํ˜•์‹์„ binary๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค. ์ดํ›„ google drive์— jsonํŒŒ์ผ์„ ์˜ฌ๋ฆฐ๋‹ค.

from google.colab import drive
import os
import time
import json

# Google Drive ๋งˆ์šดํŠธ
drive.mount('/content/drive')

# ํŠธ๋ฆฌ๊ฑฐ ํŒŒ์ผ๊ณผ Colab ํŒŒ์ผ์ด ์žˆ๋Š” Google Drive ํด๋” ๊ฒฝ๋กœ ์„ค์ •
folder_path = '/content/drive/My Drive/colab_folder_test'  # ์‹ค์ œ ํด๋” ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝ
trigger_file = os.path.join(folder_path, 'trigger.json')

# ํŠธ๋ฆฌ๊ฑฐ ํŒŒ์ผ ๊ฐ์ง€ ๋ฐ ์‹คํ–‰ ๋ฃจํ”„
while True:
    if os.path.exists(trigger_file):  # trigger.json ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
        print("Trigger file detected!")

        # trigger.json ํŒŒ์ผ ์ฝ๊ธฐ
        with open(trigger_file, 'r') as f:
            data = json.load(f)
            print(f"Trigger data: {data}")

        # ํŠธ๋ฆฌ๊ฑฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฆฌ์ŠคํŠธ์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์ฒ˜๋ฆฌ
        if isinstance(data, list) and len(data) > 0:
            data = data[0]  # ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ

        # Colab ์ž‘์—… ์ˆ˜ํ–‰
        a = data.get('a')
        b = data.get('b')
        print(f"Executing script with a={a} and b={b}")

        # ์›ํ•˜๋Š” ์ž‘์—… ์ˆ˜ํ–‰
        # ์˜ˆ: ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๋ชจ๋ธ ํ•™์Šต ๋“ฑ
        print(f"The sum of a and b is {a + b}")

        # ํŠธ๋ฆฌ๊ฑฐ ํŒŒ์ผ ์‚ญ์ œ
        os.remove(trigger_file)
        print("Trigger file processed and deleted.")
    else:
        print("Waiting for trigger file...")

    time.sleep(5)  # 5์ดˆ ๋Œ€๊ธฐ ํ›„ ๋‹ค์‹œ ํ™•์ธ

colab์—์„œ ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด google drive์—์„œ colab์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”(mount) ๋™์˜๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  n8n์„ ์‹คํ–‰ํ•˜๋ฉด trigger ํŒŒ์ผ์ด ๋“œ๋ผ์ด๋ธŒ์— ๋“ค์–ด๊ฐ€๊ณ ,

์ฝ”๋žฉ์ด ์‹คํ–‰๋ผ์„œ a, b๊ฐ’์ด ์ž˜ ๋“ค์–ด์˜จ๊ฒŒ ํ™•์ธ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด a, b๋ฅผ ํšŒ์‚ฌ ์ •๋ณด๋กœ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

       # Colab ์ž‘์—… ์ˆ˜ํ–‰
        CORP_NAME = data.get('CORP_NAME')
        BGN_DE = data.get('BGN_DE')
        REPORT_TP = data.get('REPORT_TP')

๊ทธ๋ฆฌ๊ณ  colab์—์„œ DART API ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„ ๋ณ€์ˆ˜๋ช…์„ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

ckd = corp_list.find_by_corp_name('์ข…๊ทผ๋‹น', exactly=True)[0]
# 2023๋…„๋ถ€ํ„ฐ ์—ฐ๊ฐ„ ์—ฐ๊ฒฐ์žฌ๋ฌด์ œํ‘œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
ckd_fs = ckd.extract_fs(bgn_de='20240101',separate=True,report_tp=['annual'])
# ์žฌ๋ฌด์ œํ‘œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์—‘์…€ํŒŒ์ผ๋กœ ์ €์žฅ ( ๊ธฐ๋ณธ์ €์žฅ์œ„์น˜: ์‹คํ–‰ํด๋”/fsdata )
ckd_fs.save('ckd2.xlsx')

์‹œ์—ฐ

https://imgur.com/5pH9d9d

๊ฒฐ๊ณผ์™€ ๋ฐฐ์šด ์ 

N8N๋„ ์—ญ์‹œ ์ฒ˜์Œ ์“ฐ๋ฉด ์–ด๋ ต๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ๊ฐ๋ณด๋‹ค ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. ์‹œ๊ฐํ™”ํ•ด์„œ ํ•œ๋‹จ๊ณ„์”ฉ ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒŒ ๋ณด์ด๋‹ˆ๊นŒ ์ข‹๋‹ค.

๋ฐฐ์šด ์ ๊ณผ ๋‚˜๋งŒ์˜ ๊ฟ€ํŒ์„ ์•Œ๋ ค์ฃผ์„ธ์š”.

ํ…Œ์ŠคํŠธํ•˜๋ฉด์„œ ๋ธ”๋ก ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค์–ด๊ฐ€์ž.

๊ณผ์ • ์ค‘์— ์–ด๋–ค ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์—ˆ๋‚˜์š”?

Convert to JSON์„ ์“ฐ๋Š”๋ฐ Convert JSON to binary์ธ๋ฐ, ์™œ ์ด๋ฆ„์ด ๋‹ค๋ฅธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์‚ฌ์‹ค ์•„์ง๋„ binary๋กœ ๋ฐ”๋€๊ฒŒ ๋งž๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.

์ˆ˜์ •์ด ํ•„์š”ํ•œ ์‚ฌํ•ญ์ด ์žˆ๋‚˜์š”?

  1. ํŠธ๋ฆฌ๊ฑฐ ํŒŒ์ผ ์ธ์‹ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. ๋“œ๋ผ์ด๋ธŒ์— ํŒŒ์ผ ์˜ฌ๋ผ์˜ค๋Š”๋ฐ colab์ด ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์ด ์‹œ๊ฐ„๋„ ์ค„์ด๊ณ  ์‹ถ๋‹ค.

  1. Colab์„ ์‹คํ–‰์‹œํ‚ค๊ณ  ๋‚˜์„œ n8n์„ ๋Œ๋ ค์•ผ ๋˜๋Š” ๊ณผ์ •์„ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค. Webhook์„ ์“ฐ๊ฑฐ๋‚˜ flask์„œ๋ฒ„๋ฅผ colab์— ๋„์šฐ๋ฉด ๋œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ๋‹ค์Œ๋ฒˆ์— ์ œ๋Œ€๋กœ ์‹œ๋„ํ•ด๋ณด๊ณ  ์ •๊ธฐ๋‹˜๊ป˜ ์งˆ๋ฌธํ•ด์•ผ ๊ฒ ๋‹ค.

์•ž์œผ๋กœ์˜ ๊ณ„ํš์ด ์žˆ๋‹ค๋ฉด ๋“ค๋ ค์ฃผ์„ธ์š”.

์—ฌ๊ธฐ์„œ ๋ฐ›์€ ์—‘์…€ raw ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ฐ€๊ณตํ•œ๋‹ค.

4
4๊ฐœ์˜ ๋‹ต๊ธ€

๐Ÿ‘‰ ์ด ๊ฒŒ์‹œ๊ธ€๋„ ์ฝ์–ด๋ณด์„ธ์š”