YOGYUI

MySQL - 2021 국내주식 공모주(IPO) 데이터베이스 만들기 (3) 본문

Software/SQL

MySQL - 2021 국내주식 공모주(IPO) 데이터베이스 만들기 (3)

요겨 2021. 9. 28. 17:45
반응형

 

앞선 글(링크)에서 금융감독원 OpenDART의 '증권신고서 주요정보 - 지분증권' API로 신규상장기업의 증권신고서 원문 문서번호를 얻고자 했는데, 안타깝게도 쿼리되지 않는 기업이 굉장히 많았다

 

이번 포스트에서는 OpenDART의 '공시검색'으로 특정 기업이 공시한 증권신고서를 전부 리스트업한 뒤 그중에서 상장과 관련된 지분증권 문서의 문서번호를 가져오고, 문서의 HTML 원문을 로컬에 저장해보도록 하자

 

OpenDART 사용법 및 DART 원문 다운로드 방법은 아래 링크를 참고

금융감독원::OPENDART 전자공시 Open API 사용하기

금융감독원::DART 공시문서 js 렌더링된 HTML 가져오기

 

지난 2021년 7월 26일,27일 양일간 공모주 청약을 진행한 카카오뱅크를 예로 들어보자

import pymysql
import requests

corp_name = "카카오뱅크"

# IPO2021 테이블에서 DART 기업코드를 가져온다
db_conn = pymysql.connect(host="my.sql.server", port=3306, user="yogyui", passwd="password", db='STOCK')
cursor = db_conn.cursor()
cursor.execute(f"SELECT * FROM IPO2021 WHERE `이름`='{corp_name}';")
result = cursor.fetchall()
corp_code = result[0][5]

# 증권신고서 주요정보 - 지분증권 OpenAPI 호출
api_key = "Your API Key from OpenDART"
url = "https://opendart.fss.or.kr/api/estkRs.json"
params = {
    "crtfc_key": api_key,
    "corp_code": corp_code,
    "bgn_de": "20210101",
    "end_de": "20211231"
}
response = requests.get(url, params=params)
json = response.json()

db_conn.close()
In [1]: corp_code
Out[1]: '01133217'

In [2]: json
Out[2]: {'status': '013', 'message': '조회된 데이타가 없습니다.'}

확실히 찾을 수가 없다 ㅠㅠ (분명 되는 기업도 많은데 말이지...)

이게 DART 관리자가 카테고리 분류랑 문서 요약을 해놔야되는건가? 

원인은 모르겠지만 어쨌든 안된다! 

 

해결책으로 OpenDART의 공시검색으로 문서를 전부 리스트업해보자

(자세한 API 사용법은 링크 참고)

url = "https://opendart.fss.or.kr/api/list.json"
api_key = "Your API Key from OpenDART"
params = {
    "crtfc_key": api_key,
    "corp_code": corp_code,
    "bgn_de": "20210101",
    "end_de": "20211231",
    "last_reprt_at": "N",  # 최종보고서 포함한 모든 보고서 
    "pblntf_ty": "C",  # 발행공시
    "pblntf_detail_ty": "C001", # 지분증권
    "page_count": 100
}
response = requests.get(url, params=params)
json = response.json()

넉넉하게 2021년 1월 1일부터 2021년 12월 31일까지 검색범위를 설정해주고, 최종보고서를 포함한 모든 보고서를 검색하기 위해 last_reprt_at 인자는 "N"으로, 발생공시의 지분증권을 검색하기 위해 pllntf_ty와 pblntf_detail_ty인자들은 각각 "C"와 "C001"로 값을 지정해줬다

In [3]: json
Out[3]: 
{'status': '000',
 'message': '정상',
 'page_no': 1,
 'page_count': 100,
 'total_count': 7,
 'total_page': 1,
 'list': [{'corp_code': '01133217',
   'corp_name': '카카오뱅크',
   'stock_code': '323410',
   'corp_cls': 'Y',
   'report_nm': '증권발행실적보고서',
   'rcept_no': '20210729000467',
   'flr_nm': '카카오뱅크',
   'rcept_dt': '20210729',
   'rm': ''},
  {'corp_code': '01133217',
   'corp_name': '카카오뱅크',
   'stock_code': '323410',
   'corp_cls': 'Y',
   'report_nm': '[기재정정]투자설명서',
   'rcept_no': '20210722000374',
   'flr_nm': '카카오뱅크',
   'rcept_dt': '20210722',
   'rm': ''},
  {'corp_code': '01133217',
   'corp_name': '카카오뱅크',
   'stock_code': '323410',
   'corp_cls': 'Y',
   'report_nm': '[발행조건확정]증권신고서(지분증권)',
   'rcept_no': '20210722000371',
   'flr_nm': '카카오뱅크',
   'rcept_dt': '20210722',
   'rm': ''},
  {'corp_code': '01133217',
   'corp_name': '카카오뱅크',
   'stock_code': '323410',
   'corp_cls': 'Y',
   'report_nm': '투자설명서',
   'rcept_no': '20210720000303',
   'flr_nm': '카카오뱅크',
   'rcept_dt': '20210720',
   'rm': '정'},
  {'corp_code': '01133217',
   'corp_name': '카카오뱅크',
   'stock_code': '323410',
   'corp_cls': 'Y',
   'report_nm': '[첨부정정]증권신고서(지분증권)',
   'rcept_no': '20210719000305',
   'flr_nm': '카카오뱅크',
   'rcept_dt': '20210719',
   'rm': '정'},
  {'corp_code': '01133217',
   'corp_name': '카카오뱅크',
   'stock_code': '323410',
   'corp_cls': 'Y',
   'report_nm': '[기재정정]증권신고서(지분증권)',
   'rcept_no': '20210719000237',
   'flr_nm': '카카오뱅크',
   'rcept_dt': '20210719',
   'rm': '정'},
  {'corp_code': '01133217',
   'corp_name': '카카오뱅크',
   'stock_code': '323410',
   'corp_cls': 'Y',
   'report_nm': '증권신고서(지분증권)',
   'rcept_no': '20210628000249',
   'flr_nm': '카카오뱅크',
   'rcept_dt': '20210628',
   'rm': '정'}]}

결과 json의 'list'에 총 7개의 문서 정보가 담긴 것을 확인!

보기 편하게 만들기 위해 pandas Dataframe으로 변환해주자

import pandas as pd

json_list = json.get('list')
df_json_list = pd.DataFrame(json_list)

dataframe
dart 홈페이지 공시 검색 결과

DART 홈페이지에서 검색한 결과와 동일하게 7개의 문서 리스트를 가져올 수 있다

이 중 '증권신고서(지분증권)'은 총 4개인데, 청약일정 직전에 업데이트된 문서는 7월 22일에 공시된 '[발행조건확정]증권신고서(지분증권)'으로 문서번호는 20210722000371인 것을 알 수 있다

 

만약 '최종보고서' 옵션을 선택하면 [발행조건확정] 문서만 검색되는 것을 알 수 있다
(last_reptr_at 인자를 'Y'로 설정)

params = {
    "crtfc_key": api_key,
    "corp_code": corp_code,
    "bgn_de": "20210101",
    "end_de": "20211231",
    "last_reprt_at": "Y",  # 최종보고서만 검색
    "pblntf_ty": "C",  # 발행공시
    "pblntf_detail_ty": "C001", # 지분증권
    "page_count": 100
}

이제 공시문서 원문을 DART 홈페이지에서 Javascript 렌더링 후 HTML 포맷으로 로컬에 저장해보자

(코드가 상당히 길다... 자세한 내용은 문서 처음에 언급한 링크를 참고)

import os
import urllib.parse
from lxml import etree, html
from requests_html import HTMLSession

datapath = os.path.join(os.path.abspath('./'), 'data')
if not os.path.isdir(datapath):
    os.mkdir(datapath)
    
record = df_json_list[df_json_list['report_nm'].str.contains('\[발행조건확정\]증권신고서\(지분증권\)')]
document_no = record.iloc[0]['rcept_no']

htmlpath = os.path.join(datapath, f'{document_no}.html')
if not os.path.isfile(htmlpath):
    # dart document view request
    url_doc = "https://dart.fss.or.kr/dsaf001/main.do?rcpNo={}".format(document_no)
    session = HTMLSession()
    response = session.get(url_doc)
    
    # render javascript in page and get modified tag
    response.html.render()
    element = response.html.lxml
    tag_iframe = element.get_element_by_id("ifrm")
    attrib_src = tag_iframe.attrib.get("src")
    url_page = "https://dart.fss.or.kr{}".format(attrib_src)
    
    # modify document url
    url_parsed = urllib.parse.urlparse(url_page)
    queries = url_parsed.query.split('&')
    queries_split = [x.split('=') for x in queries]
    queries_dict = {}
    for q in queries_split:
        queries_dict[q[0]] = q[1]
    queries_dict['offset'] = '0'
    queries_dict['length'] = '0'
    queries = '&'.join([f'{x[0]}={x[1]}' for x in queries_dict.items()])
    url_parsed = url_parsed._replace(query=queries).geturl()
    
    # request document page
    response = session.get(url_parsed)
    
    # change relative link to absolute link
    element = response.html.lxml
    tag_link = element.find('.//link')
    tag_link.attrib['href'] = "https://dart.fss.or.kr{}".format(tag_link.attrib['href'])
    tags_img = element.findall('.//img')
    for tag in tags_img:
        tag.attrib['src'] = "https://dart.fss.or.kr{}".format(tag.attrib['src'])
        
    # save html file
    encoding = response.html.encoding
    str_enc = etree.tostring(element, encoding=encoding, method='html', pretty_print=True)
    str_dec = str_enc.decode(encoding)
    with open(htmlpath, 'w', encoding=encoding) as fp:
        fp.write(str_dec)
    session.close()

실제 로컬에 HTML 파일이 저장된 것을 확인할 수 있다

 

파일을 웹 브라우저로 열어보면

 

요런 식으로 저장된다

20210722000371.html
0.23MB

 

로컬에 저장된 HTML 파일로 DART의 공시문서뷰어에 디스플레이되는 포맷 그대로 렌더링되는 것을 알 수 있다 (css와 script의 주소를 모두 절대주소로 바꿨으므로 ㅎㅎ)

 

이제 위 코드를 함수로 만들어서 IPO2021 레코드 전체에 대해 문서번호를 UPDATE하고 문서원문을 로컬에 저장해보자 (2021년 1월에 상장된 기업은 2020년에 증권신고서 공시가 되었을 수도 있으므로 검색 범위를 좀 더 앞당겨준다)

리츠의 경우 '발행공시(C) - 지분증권(C001)'이 아니라 '펀드공시(G)'로 검색해야된다!

import os
import pymysql
import requests
import urllib.parse
import pandas as pd
from lxml import etree, html
from requests_html import HTMLSession

def queryTableFromIPO2021(db_conn: pymysql.connections.Connection) -> pd.DataFrame:
    cursor = db_conn.cursor()
    # get columns name
    cursor.execute("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='IPO2021';")
    result = cursor.fetchall()
    colnames = [x[0] for x in result]

    cursor.execute("SELECT * FROM IPO2021;")
    result = cursor.fetchall()
    df = pd.DataFrame(result)
    df.columns = colnames
    return df

def getDocumentNumber(corp_code: str) -> str:
    url = "https://opendart.fss.or.kr/api/list.json"
    api_key = "Your API Key from OpenDART"
    params = {
        "crtfc_key": api_key,
        "corp_code": corp_code,
        "bgn_de": "20200101",
        "end_de": "20211231",
        "last_reprt_at": "Y",  # 최종보고서
        "pblntf_ty": "C",  # 발행공시
        "page_count": 100
    }
    response = requests.get(url, params=params)
    json = response.json()
    json_list = json.get('list')
    df_json_list = pd.DataFrame(json_list)
    if df_json_list.empty:  # 리츠의 경우 펀드공시
        params = {
            "crtfc_key": api_key,
            "corp_code": corp_code,
            "bgn_de": "20200101",
            "end_de": "20211231",
            "last_reprt_at": "Y",  # 최종보고서
            "pblntf_ty": "G",  # 펀드공시
            "page_count": 100
        }
        response = requests.get(url, params=params)
        json = response.json()
        json_list = json.get('list')
        df_json_list = pd.DataFrame(json_list)

    record = df_json_list[df_json_list['report_nm'].str.contains('증권신고서\(지분증권')]
    if record.empty:
        record = df_json_list[df_json_list['report_nm'].str.contains('증권신고서\(집합투자증권')]
    if record.empty:
        record = df_json_list[df_json_list['report_nm'].str.contains('증권신고서\(증권예탁증권')]
    rcept_no = record.iloc[0]['rcept_no']
    report_nm = record.iloc[0]['report_nm']
    print(rcept_no, report_nm)
    return rcept_no

def updateTableDocumentNumber(db_conn: pymysql.connections.Connection, corp_code: str, document_no: str):
    cursor = db_conn.cursor()
    sql = "UPDATE IPO2021 SET "
    sql += "`문서번호` = '{}',".format(document_no)
    sql = sql[:-1] + " WHERE `기업코드` = '{}';".format(corp_code)
    result = cursor.execute(sql)
    print('({}) {}\n'.format(result, sql))

def downloadDocument(document_no: str):
    datapath = os.path.join(os.path.abspath('./'), 'data')
    if not os.path.isdir(datapath):
        os.mkdir(datapath)
    htmlpath = os.path.join(datapath, f'{document_no}.html')
    if not os.path.isfile(htmlpath):
        # dart document view request
        url_doc = "https://dart.fss.or.kr/dsaf001/main.do?rcpNo={}".format(document_no)
        session = HTMLSession()
        response = session.get(url_doc)

        # render javascript in page and get modified tag
        response.html.render()
        element = response.html.lxml
        tag_iframe = element.get_element_by_id("ifrm")
        attrib_src = tag_iframe.attrib.get("src")
        url_page = "https://dart.fss.or.kr{}".format(attrib_src)

        # modify document url
        url_parsed = urllib.parse.urlparse(url_page)
        queries = url_parsed.query.split('&')
        queries_split = [x.split('=') for x in queries]
        queries_dict = {}
        for q in queries_split:
            queries_dict[q[0]] = q[1]
        queries_dict['offset'] = '0'
        queries_dict['length'] = '0'
        queries = '&'.join([f'{x[0]}={x[1]}' for x in queries_dict.items()])
        url_parsed = url_parsed._replace(query=queries).geturl()

        # request document page
        response = session.get(url_parsed)

        # change relative link to absolute link
        element = response.html.lxml
        tag_link = element.find('.//link')
        tag_link.attrib['href'] = "https://dart.fss.or.kr{}".format(tag_link.attrib['href'])
        tags_img = element.findall('.//img')
        for tag in tags_img:
            tag.attrib['src'] = "https://dart.fss.or.kr{}".format(tag.attrib['src'])

        # save html file
        encoding = response.html.encoding
        str_enc = etree.tostring(element, encoding=encoding, method='html', pretty_print=True)
        str_dec = str_enc.decode(encoding)
        with open(htmlpath, 'w', encoding=encoding) as fp:
            fp.write(str_dec)
        session.close()

if __name__ == '__main__':
    db_conn_ = pymysql.connect(host="my.sql.server", port=3306, user="yogyui", passwd="password", db='STOCK')
    df_ipo2121 = queryTableFromIPO2021(db_conn_)
    for i in range(len(df_ipo2121)):
        print(df_ipo2121.iloc[i]['이름'] + ': ', end='')
        corp_code_ = df_ipo2121.iloc[i]['기업코드']
        document_no_ = getDocumentNumber(corp_code_)
        updateTableDocumentNumber(db_conn_, corp_code_, document_no_)
        downloadDocument(document_no_)
    db_conn_.commit()
    db_conn_.close()
엠로: 20210803000202 [발행조건확정]증권신고서(지분증권)
(0) UPDATE IPO2021 SET `문서번호` = '20210803000202' WHERE `기업코드` = '00396925';

해성티피씨: 20210409000501 [발행조건확정]증권신고서(지분증권)
(0) UPDATE IPO2021 SET `문서번호` = '20210409000501' WHERE `기업코드` = '00453442';

선진뷰티사이언스: 20210114000344 [발행조건확정]증권신고서(지분증권)
(0) UPDATE IPO2021 SET `문서번호` = '20210114000344' WHERE `기업코드` = '00132202';

롯데렌탈: 20210806000291 [발행조건확정]증권신고서(지분증권)
(0) UPDATE IPO2021 SET `문서번호` = '20210806000291' WHERE `기업코드` = '00545716';

브레인즈컴퍼니: 20210806000100 [발행조건확정]증권신고서(지분증권)
(0) UPDATE IPO2021 SET `문서번호` = '20210806000100' WHERE `기업코드` = '00642897';

(...)

출력결과물을 보니 다음 4개 기업은 문서제목에 '지분증권'이 붙어있지 않았다

  • 디앤디플랫폼리츠: [기재정정]증권신고서(집합투자증권-회사형)((주)디앤디플랫폼위탁관리부동산투자회사)
  • SK리츠: [기재정정]증권신고서(집합투자증권-회사형)(에스케이위탁관리부동산투자회사㈜)
  • 프레스티지바이오파마: [발행조건확정]증권신고서(증권예탁증권)
  • 네오이뮨텍: [발행조건확정]증권신고서(증권예탁증권)

63개 기업의 HTML 원문파일들의 용량은 26.5MB 정도이니 딱히 부담스러운 크기는 아니다

 

DB 테이블을 쿼리해보자

MySQL [stock]> SELECT * FROM IPO2021 ORDER BY `상장일`;
+----------+------------------------+------------+--------+------------+----------+----------------+
| 종목코드 | 이름                   | 상장일     | 공모가 | 상장주식수 | 기업코드 | 문서번호       |
+----------+------------------------+------------+--------+------------+----------+----------------+
| 236810   | 엔비티                 | 2021-01-21 |  19000 |    8487713 | 01051065 | 20210111000425 |
| 086710   | 선진뷰티사이언스       | 2021-01-27 |  11500 |    6115650 | 00132202 | 20210114000344 |
| 352700   | 씨앤투스성진           | 2021-01-28 |  32000 |    9995531 | 00875237 | 20210115000205 |
| 348030   | 모비릭스               | 2021-01-28 |  14000 |    9304000 | 01210190 | 20210118000263 |
| 163730   | 핑거                   | 2021-01-29 |  16000 |    9239014 | 01142075 | 20210119000041 |
| 248070   | 솔루엠                 | 2021-02-02 |  17000 |   50005551 | 01159233 | 20210120000138 |
| 321820   | 와이더플래닛           | 2021-02-03 |  16000 |    6897482 | 01116502 | 20210121000390 |
| 277810   | 레인보우로보틱스       | 2021-02-03 |  10000 |   16135214 | 01261644 | 20210121000417 |
| 262840   | 아이퀘스트             | 2021-02-05 |  11000 |    9860000 | 01146822 | 20210125000472 |
| 950210   | 프레스티지바이오파마   | 2021-02-05 |  32000 |   60096155 | 01510489 | 20210122000280 |
| 239890   | 피엔에이치테크         | 2021-02-16 |  18000 |    4516016 | 01112889 | 20210202000317 |
| 322310   | 오로스테크놀로지       | 2021-02-24 |  21000 |    9309542 | 01016479 | 20210210001153 |
| 189330   | 씨이랩                 | 2021-02-24 |  35000 |    3013642 | 00991298 | 20210210000209 |
| 340930   | 유일에너테크           | 2021-02-25 |  16000 |   10674744 | 01368637 | 20210209000376 |
| 338220   | 뷰노                   | 2021-02-26 |  21000 |   11168656 | 01344202 | 20210215001076 |
| 247660   | 나노씨엠에스           | 2021-03-09 |  20000 |    4208920 | 00660459 | 20210224003205 |
| 334970   | 프레스티지바이오로직스 | 2021-03-11 |  12400 |   47206389 | 01258428 | 20210226005985 |
| 356890   | 싸이버원               | 2021-03-11 |   9500 |    4640830 | 01293953 | 20210226004042 |
| 950220   | 네오이뮨텍             | 2021-03-16 |   7500 |   98417010 | 01511558 | 20210226004608 |
| 314930   | 바이오다인             | 2021-03-17 |  30000 |    6168195 | 01117413 | 20210304000632 |
| 302440   | SK바이오사이언스       | 2021-03-18 |  65000 |   76500000 | 01319899 | 20210308000389 |
| 347700   | 라이프시맨틱스         | 2021-03-23 |  12500 |   10119770 | 01336762 | 20210310000574 |
| 361390   | 제노코                 | 2021-03-24 |  36000 |    2442140 | 01014718 | 20210312000037 |
| 289220   | 자이언트스텝           | 2021-03-24 |  11000 |    9655765 | 01264438 | 20210312000373 |
| 333620   | 엔시스                 | 2021-04-01 |  19000 |   10556344 | 01310773 | 20210319000700 |
| 351330   | 이삭엔지니어링         | 2021-04-21 |  11500 |    8288520 | 01135640 | 20210409000102 |
| 059270   | 해성티피씨             | 2021-04-21 |  13000 |    4630000 | 00453442 | 20210409000501 |
| 294570   | 쿠콘                   | 2021-04-28 |  45000 |    8077071 | 01311055 | 20210416000323 |
| 361610   | SK아이이테크놀로지     | 2021-05-11 | 105000 |   71297592 | 01386916 | 20210426000421 |
| 357230   | 에이치피오             | 2021-05-14 |  22200 |   19938160 | 01068737 | 20210430001176 |
| 352480   | 씨앤씨인터내셔널       | 2021-05-17 |  47500 |    6675961 | 01226410 | 20210504000459 |
| 252990   | 샘씨엔에스             | 2021-05-20 |   6500 |   50153846 | 01199727 | 20210507000560 |
| 361670   | 삼영에스앤씨           | 2021-05-21 |  11000 |    5557158 | 00405506 | 20210510000411 |
| 363250   | 진시스템               | 2021-05-26 |  20000 |    6811080 | 01437858 | 20210512000079 |
| 276730   | 제주맥주               | 2021-05-26 |   3200 |   56485461 | 01230255 | 20210512000257 |
| 187660   | 에이디엠코리아         | 2021-06-03 |   3800 |   21836250 | 01409022 | 20210521000157 |
| 376190   | 엘비루셈               | 2021-06-11 |  14000 |   24600000 | 00527011 | 20210601000009 |
| 232680   | 라온테크               | 2021-06-17 |  18000 |    4886005 | 00911229 | 20210603000119 |
| 303530   | 이노뎁                 | 2021-06-18 |  18000 |    7302549 | 01264872 | 20210608000087 |
| 357580   | 아모센스               | 2021-06-25 |  12400 |   11200076 | 01012987 | 20210614000251 |
| 352910   | 오비고                 | 2021-07-13 |  14300 |   11410834 | 00494546 | 20210630000365 |
| 137310   | 에스디바이오센서       | 2021-07-16 |  52000 |  103271353 | 00854997 | 20210707000336 |
| 365270   | 큐라클                 | 2021-07-22 |  25000 |   13582968 | 01397772 | 20210712000094 |
| 377030   | 맥스트                 | 2021-07-27 |  15000 |    8533491 | 01409095 | 20210715000153 |
| 270660   | 에브리봇               | 2021-07-28 |  36700 |    6095671 | 01201590 | 20210716000169 |
| 323410   | 카카오뱅크             | 2021-08-06 |  39000 |  475100237 | 01133217 | 20210722000371 |
| 195940   | 에이치케이이노엔       | 2021-08-09 |  59000 |   28904499 | 01012066 | 20210728000287 |
| 259960   | 크래프톤               | 2021-08-10 | 498000 |   48951445 | 00760971 | 20210729000415 |
| 376980   | 원티드랩               | 2021-08-11 |  35000 |    4703068 | 01441611 | 20210730000186 |
| 367000   | 플래티어               | 2021-08-12 |  11000 |    8269707 | 01454341 | 20210803000188 |
| 058970   | 엠로                   | 2021-08-13 |  22600 |    5426060 | 00396925 | 20210803000202 |
| 372910   | 한컴라이프케어         | 2021-08-17 |  13700 |   27674406 | 00534598 | 20210803000127 |
| 315640   | 딥노이드               | 2021-08-17 |  42000 |    4290997 | 01344831 | 20210804000111 |
| 099390   | 브레인즈컴퍼니         | 2021-08-19 |  25000 |    4108796 | 00642897 | 20210806000100 |
| 089860   | 롯데렌탈               | 2021-08-19 |  59000 |   36634063 | 00545716 | 20210806000291 |
| 139990   | 아주스틸               | 2021-08-20 |  15100 |   26452189 | 00486705 | 20210805000205 |
| 308080   | 바이젠셀               | 2021-08-25 |  52700 |    9435680 | 01335790 | 20210811000035 |
| 377190   | 디앤디플랫폼리츠       | 2021-08-27 |   5000 |   64400000 | 01475609 | 20210730000126 |
| 271940   | 일진하이솔루스         | 2021-09-01 |  34300 |   36313190 | 00972503 | 20210823000374 |
| 203400   | 에이비온               | 2021-09-08 |  17000 |   15249795 | 00977377 | 20210827000132 |
| 273640   | 와이엠텍               | 2021-09-10 |  28000 |    5393000 | 01215618 | 20210830000425 |
| 395400   | SK리츠                 | 2021-09-14 |   5000 |  155020532 | 01535150 | 20210827000120 |
| 329180   | 현대중공업             | 2021-09-17 |  60000 |   88773116 | 01390344 | 20210906000346 |
+----------+------------------------+------------+--------+------------+----------+----------------+
63 rows in set (0.002 sec)

문서번호 및 문서번호에 해당하는 HTML 파일이 있으니 굳이 DART에 접속하지 않더라도 쉽게 문서를 열람할 수 있게 되었다


안타깝게도 일부 기업의 경우 조건확정 문서 내에 정정사항에 대한 표기만 해주는 경우가 있어 전체 정보를 알 수 없다는 단점이 있다 (되게 무기력해지네 ㅋㅋㅋ)

 

ex) 현대중공업 발행조건 확정 문서 (문서번호 20210906000346)

20210906000346.html
0.09MB
정정된 부분만 담고 있다...

 

일단 오늘은 이렇게 마무리하고, 다음에는 증권신고서(지분증권) 전체 문서를 가져오는 코드를 짜보자

 

TODO:

기업별 증권신고서 전체 이력의 문서번호 가져오기

로컬에 저정한 HTML 문서에서 중요한 정보 추출

반응형