본문 바로가기
취미/주식

공모주 [발행조건확정]증권신고서(지분증권) 트래커 만들기

by davi_kr 2023. 10. 16.

목차

    반응형

    AI 관련 공부 할때, 주식 쪽이 정보가 빨라 정보를 긁어오려 크롤링 공부하고 있습니다.

    그러다 공모주 정보를 한번 긁어와보고 싶단 생각이 들어서 만들어봤습니다.

     

    결과물)

    파이썬 스케줄러와 구글 스프레드 시트 스케줄러가 돌면서 시트에 내용을 기록해주고 메일도 발송해줍니다.

    스케줄러만 달면 바로 작동 가능한 코드입니다. 

    문서가 올라오는 시간이 몇시인지까지는 정확히 몰라서 스케줄러는 가능하면 저녁 시간으로 셋팅하는게 좋을 것 같습니다.

    저는 파이썬 코드만 돌리고 거기서 이메일 받을까 생각하다 시트에다가도 자동으로 정리해두고 메일 노티도 받고 나중에 거기다가 내용도 추가할 생각으로 구글 시트도 같이 연결했습니다.

     

    먼저 파이썬 코드입니다.

    import requests
    import json
    import os
    from datetime import datetime
    import pandas as pd
    
    # 오늘 날짜를 YYYYMMDD 형식으로 가져오기
    today = datetime.now().strftime('%Y%m%d')
    # today = '20231013'
    
    # API 엔드포인트 URL
    url = "https://opendart.fss.or.kr/api/list.json"
    
    # api_key
    api_key = os.environ.get('dart_api_key')
    
    # 파라미터
    params = {
        "crtfc_key": api_key,
        "bgn_de": today,
        "end_de": today,
        "last_reprt_at": "Y",
        "pblntf_ty": "C",
        "pblntf_detail_ty":"C001"
    }
    
    # API 요청
    response = requests.get(url, params=params)
    
    # 응답 확인 및 출력
    if response.status_code == 200:
        data = response.json()
    else:
        print(f"Error: 데이터를 가져오지 못했어요. Status code: {response.status_code}")
    
    # 지분증권 공모주 발행조건 확정된 경우만 뽑기
    df = pd.DataFrame(data['list'])
    df_ipo = df.loc[df['report_nm'].str.contains('[발행조건확정]증권신고서(지분증권)', regex=False),:]
    df_ipo.reset_index(inplace=True, drop=True)
    
    # 메일로 받아볼 정보만 추리기
    df_ipo = df_ipo[['corp_name','rcept_no']]
    
    from function_packages_davi.google_functions_davi import google_sheet_link
    
    # 연동되는 구글 시트 url
    spreadsheet_url = "본인 사용할 구글 시트"
    
    # 해당 url의 봇 권한을 이용해 연결하고 doc으로 저장
    doc = google_sheet_link(spreadsheet_url)    
    worksheet = doc.worksheet("Dart 트래커(증권발행조건확정)")
    worksheet2 = doc.worksheet("자동화용 시트 정보 트래커")
    
    # 데이터가 얼마나 쌓여있는지 체크
    existed_data_len = int(worksheet2.cell(2, 2).value)
    
    # 쌓여있는 숫자 세서 +1한 위치부터 값을 추가하기
    worksheet.update('a{}'.format(existed_data_len + 1), df_ipo.values.tolist())
    from function_packages_davi.google_functions_davi import google_sheet_link

    이 부분은 아래 포스팅을 참고해주세요~!

    여기를 클릭하세요!

     

    파이썬을 이용한 구글 스프레드시트 연동 및 자동화 방법

    실무에서 활용하고 있는 파이썬 - 구글 스프레드시트 연동법에 대해 적어보려 합니다. 파이썬으로 연동한 db에서 데이터 뽑고 시트에다 자동으로 데이터 기록해주고 자동으로 기록된 데이터가

    develop-davi-kr.tistory.com

     

    그 다음 구글 시트입니다.

    Dart 트래커(증권발행조건확정) 시트에는 첫행에 회사명, 접수번호, 링크, 메일 발송 여부가 적혀있습니다.

    파이썬 코드가 다 돌아서 해당하는 값이 있는 경우에 두번째 행부터 값을 적어주는데 이를 위해 현재 몇번째 행까지 값이 적혀있는지를 알아야 합니다.

    이걸 위해 자동화용 시트 정보 트래커 시트를 만들고 거기에 함수로 현재 몇줄까지 값이 적혀있는지를 셌습니다.

    =counta('Dart 트래커(증권발행조건확정)'!$A:$A)

    파이썬 코드에서는 

    worksheet2 = doc.worksheet("자동화용 시트 정보 트래커")
    existed_data_len = int(worksheet2.cell(2, 2).value)
    worksheet.update('a{}'.format(existed_data_len + 1), df_ipo.values.tolist())

    에 해당합니다.

    a열과 b열의 값이 자동으로 채워지고 링크는 b열의 값이 채워지면 c열에는 시트에 적혀있는 함수로 인해 링크가 만들어집니다.

    =if(ISBLANK(B2),"","https://dart.fss.or.kr/dsaf001/main.do?rcpNo="&B2)

     

    메일 발송 여부는 구글 시트 자체에 설정된 스케줄러에서 특정 시간에 돌면서 메일을 발송하고 나면 O로 표시가 됩니다.

     

    구글 앱스크립트입니다.

    function sendEmail() {
    
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Dart 트래커(증권발행조건확정)');
      const data = sheet.getDataRange().getValues()
    
      // A열이 빈 칸이 아닌 행만 포함하는 새로운 배열
      const filteredData = data.filter(function(row) {
        return row[0] !== ""; // A열이 빈 칸이 아닌 경우만 반환
      });
    
      body = ""
    
      for(i=1;i<filteredData.length;i++){
        if(data[i][3]==""){
          body += `회사명: ${data[i][0]}, 신고서링크: ${data[i][2]}\n`
          sheet.getRange(i+1,4).setValue('O')
        }
      }
      Logger.log(body)
      if(body != ""){
          let subject = "발행조건이 확정된 증권신고서가 확인됐어요!";
          var body = body;
          var recipient = "test@email.com"; // 수신자 이메일 주소
          
          GmailApp.sendEmail(recipient, subject, body);
      }
    }

    시계 모양을 누르면 스케줄러(트리거)를 만들 수 있습니다. 아래와 같이 설정했습니다.

    해보는 김해서 재미로 만들어봤는데요. 공시 문서까지 접근할 수 있어서 안에 있는 데이터도 다 긁어오면 좋겠는데 아직 기술력이 부족하네요. 더 파보고 올려보겠습니다^^

    반응형

    댓글