sihyeong671 / Quant_Project

퀀트 주식투자 프로젝트 입니다
5 stars 4 forks source link

FS 크롤링 이슈 (아남전자) #127

Open hyun98 opened 2 years ago

hyun98 commented 2 years ago

'corp_code': '00138516', 'bsns_year': '2021', 'reprt_code': '11013', 'fs_div': 'CFS'

문제점 : sub_account를 만들기 전 에 fs_account가 만들어 져야 하는데 만들지 못함 유동 자산, 비유동자산 같은 fs_account가 api를 통해 받은 json_dict['list'] 에 들어있지 않음

위 회사의 bs_tree는 아래와 같음

{'유동자산': ['현금및현금성자산', '매출채권 및 기타유동채권', '재고자산', '당기법인세자산', '기타유동금융자산'], '비유동자산': ['장기매출채권 및 기타비유동채권', '유형자산', '투자부동산', '영업권 이외의 무형자산', '이연법인세자산', '기타비유동금융자산'], '자산총계': [], '유동부채': ['매입채무 및 기타유동채무', '단기차입금', '유동성금융리스부채', '유동성장기부채', '당기법인세부채', '유동충당부채'], '비유동부채': ['장기차입금', '비유동금융리스부채', '퇴직급여부채'], '부채총계': [], '지배기업의 소유주에게 귀속되는 자본': ['자본금', '자본잉여금', '기타자본구성요소', '기타포괄손익누계액', '이익잉여금(결손금)'], '자본총계': []}

 for data in json_dict['list']:
        if data["sj_div"] == "BS":
              print(data)

아래는 위 코드를 실행한 결과

{'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_CashAndCashEquivalents', 'account_nm': '현금및현금성자산', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '9640760', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '6998778', 'ord': '2'} make 's sub account : 현금및현금성자산 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_TradeAndOtherCurrentReceivables', 'account_nm': '매출채권 및 기타유동채권', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '63260330', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '67183866', 'ord': '3'} make 's sub account : 매출채권 및 기타유동채권 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_Inventories', 'account_nm': '재고자산', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '41670278', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '47675242', 'ord': '4'} make 's sub account : 재고자산 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_CurrentTaxAssets', 'account_nm': '당기법인세자산', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '27682', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '27116', 'ord': '5'} make 's sub account : 당기법인세자산 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_OtherCurrentFinancialAssets', 'account_nm': '기타유동금융자산', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '9601613', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '9779437', 'ord': '6'} make 's sub account : 기타유동금융자산 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'dart_LongTermTradeAndOtherNonCurrentReceivablesGross', 'account_nm': '장기매출채권 및 기타비유동채권', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '5478908', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '5525691', 'ord': '8'} make 's sub account : 장기매출채권 및 기타비유동채권 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_PropertyPlantAndEquipment', 'account_nm': '유형자산', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '31346079', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '32187824', 'ord': '9'} make 's sub account : 유형자산 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_InvestmentProperty', 'account_nm': '투자부동산', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '5380436', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '5398617', 'ord': '10'} make 's sub account : 투자부동산 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_IntangibleAssetsOtherThanGoodwill', 'account_nm': '영업권 이외의 무형자산', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '1776654', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '1822423', 'ord': '11'} make 's sub account : 영업권 이외의 무형자산 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_DeferredTaxAssets', 'account_nm': '이연법인세자산', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '78053', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '78053', 'ord': '12'} make 's sub account : 이연법인세자산 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_OtherNoncurrentFinancialAssets', 'account_nm': '기타비유동금융자산', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '290757', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '501486', 'ord': '13'} make 's sub account : 기타비유동금융자산 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_Assets', 'account_nm': '자산총계', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '168551549', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '177178532', 'ord': '14'} make fs account : 자산총계 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_TradeAndOtherCurrentPayables', 'account_nm': '매입채무 및 기타유동채무', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '47162122', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '62782840', 'ord': '17'} make 자산총계's sub account : 매입채무 및 기타유동채무 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_ShorttermBorrowings', 'account_nm': '단기차입금', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '61375036', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '56406371', 'ord': '18'} make 자산총계's sub account : 단기차입금 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'dart_CurentPortionOfFinanceLeaseLiabilities', 'account_nm': '유동성금융리스부채', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '299685', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '436080', 'ord': '19'} make 자산총계's sub account : 유동성금융리스부채 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': '-표준계정코드 미사용-', 'account_nm': '유동성장기부채', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '196049', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '633171', 'ord': '20'} make 자산총계's sub account : 유동성장기부채 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_CurrentTaxLiabilities', 'account_nm': '당기법인세부채', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '502079', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '260205', 'ord': '21'} make 자산총계's sub account : 당기법인세부채 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_CurrentProvisions', 'account_nm': '유동충당부채', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '153995', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '123968', 'ord': '22'} make 자산총계's sub account : 유동충당부채 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'dart_LongTermBorrowingsGross', 'account_nm': '장기차입금', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '0', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '0', 'ord': '24'} make 자산총계's sub account : 장기차입금 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'dart_NonCurrentFinanceLeaseLiabilities', 'account_nm': '비유동금융리스부채', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '1455018', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '1457612', 'ord': '25'} make 자산총계's sub account : 비유동금융리스부채 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'dart_PostemploymentBenefitObligations', 'account_nm': '퇴직급여부채', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '762986', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '673131', 'ord': '26'} make 자산총계's sub account : 퇴직급여부채 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_Liabilities', 'account_nm': '부채총계', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '111906970', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '122773378', 'ord': '27'} make fs account : 부채총계 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_EquityAttributableToOwnersOfParent', 'account_nm': '지배기업의 소유주에게 귀속되는 자본', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '56644579', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '54405154', 'ord': '29'} make fs account : 지배기업의 소유주에게 귀속되는 자본 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_IssuedCapital', 'account_nm': '자본금', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '34501614', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '34501614', 'ord': '30'} make 지배기업의 소유주에게 귀속되는 자본's sub account : 자본금 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'dart_CapitalSurplus', 'account_nm': '자본잉여금', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '1724124', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '1724124', 'ord': '31'} make 지배기업의 소유주에게 귀속되는 자본's sub account : 자본잉여금 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'dart_ElementsOfOtherStockholdersEquity', 'account_nm': '기타자본구성요소', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '-163350', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '-163350', 'ord': '32'} make 지배기업의 소유주에게 귀속되는 자본's sub account : 기타자본구성요소 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'dart_OtherComprehensiveIncomeLossAccumulatedAmount', 'account_nm': '기타포괄손익누계액', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '0', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '0', 'ord': '33'} make 지배기업의 소유주에게 귀속되는 자본's sub account : 기타포괄손익누계액 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_RetainedEarnings', 'account_nm': '이익잉여금(결손금)', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '20582191', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '18342766', 'ord': '34'} make 지배기업의 소유주에게 귀속되는 자본's sub account : 이익잉여금(결손금) {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_Equity', 'account_nm': '자본총계', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '56644579', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '54405154', 'ord': '35'} make fs account : 자본총계 {'rcept_no': '20210514000892', 'reprt_code': '11013', 'bsns_year': '2021', 'corp_code': '00138516', 'sj_div': 'BS', 'sj_nm': '재무상태표', 'account_id': 'ifrs-full_EquityAndLiabilities', 'account_nm': '자본과부채총계', 'account_detail': '-', 'thstrm_nm': '제 49 기 1분기말', 'thstrm_amount': '168551549', 'frmtrm_nm': '제 48 기말', 'frmtrm_amount': '177178532', 'ord': '36'}

hyun98 commented 2 years ago

테스트 코드. crtfc_key만 채워서 사용

import requests as rq
import json
from bs4 import BeautifulSoup

url = "https://opendart.fss.or.kr/api/fnlttSinglAcntAll.json?"
params = {
    'crtfc_key': '', 
    'corp_code': '00138516', 
    'bsns_year': '2021', 
    'reprt_code': '11013', 
    'fs_div': 'CFS'}
# from fake_useragent import UserAgent

# ua = UserAgent(verify_ssl=False)
# user = ua.random
# print(user)
# headers = {"User-Agent": user}
# print(headers)
def BS_accountnm_check(bs_tree, an):
    if an in bs_tree.keys():
        return True
    for key in bs_tree.keys():
        if an in key:
            return True
    return False

bs_res = rq.get(url, params)
json_dict = json.loads(bs_res.text)
bs_soup = BeautifulSoup(bs_res.text, "lxml") # html.parser 도 가능
bs_tree = \
{'유동자산': ['현금및현금성자산', '매출채권 및 기타유동채권', '재고자산', '당기법인세자산', '기타유동금융자산'], '비유동자산': ['장기매출채권 및 기타비유동채권', '유형자산', '투자부동산', '영업권 이외의 무형자산', '이연법인세자산', '기타비유동금융자산'], '자산총계': [], '유동부채': ['매입채무 및 기타유동채무', '단기차입금', '유동성금융리스부채', '유동성장기부채', '당기법인세부채', '유동충당부채'], '비유동부채': ['장기차입금', '비유동금융리스부채', '퇴직급여부채'], '부채총계': [], '지배기업의 소유주에게 귀속되는 자본': ['자본금', '자본잉여금', '기타자본구성요소', '기타포괄손익누계액', '이익잉여금(결손금)'], '자본총계': []}

# 에이테크솔루션(주) 의 bs_tree
# bs_tree = \
#     {'유동자산': ['현금및현금성자산', '매출채권 및 기타유동채권', '선급금', '기타채권', '재고자산', '기타유동자산'], '비유동자산': ['장기금융상품', '당기손익-공정가치측정금융자산', '종속기업투자자산', '장기기타채권', '이연법인세자산', '유형자산', '무형자산'], '자산총계': [], '유동부채': ['매입채무 및 기타유동채무', '외화단기차입금', '미지급법인세', '기타유동부채', '당기손익-공정가치측정금융부채', '유동성장기부채', '유동리스부채', '충당부채'], '비유동부채': ['장기차입금', '퇴직급여부채', '장기미지급금', '비유동리스부채'], '부채총계': [], '납입자본': [], '초과납입자본': [], '기타자본구성요소': [], '이익잉여금(결손금)': [], '자본총계': []}
print("===bs_tree===")
print(bs_tree)
print()
prev = ''
for data in json_dict['list']: # 한줄 씩 보여줌
    # print(data["account_nm"])
    # print("".join(data["account_nm"].split()))
    # if "당기순이익" in "".join(data["account_nm"].split()):
    #     print(data["thstrm_amount"])
    if data["sj_div"] == "BS":
        print(data)
        # print(data["account_nm"])
        is_accountnm_in_bstreekey = \
            BS_accountnm_check(bs_tree=bs_tree, an=data["account_nm"])

        if is_accountnm_in_bstreekey:
            prev = data["account_nm"]
            print(f"make fs account : {prev}")
        else:
            d = data["account_nm"]
            print(f"make {prev}'s sub account : {d}")

# lst = ['Ⅰ.유동자산', 'Ⅱ.비유동자산', '자산총계', 'Ⅰ.유동부채', 'Ⅱ.비유동부채', '부채총계', 'Ⅰ.지배기업 소유주지분', 'Ⅱ.비지배지분', '자본총계']
# if "유동자산" in 
sihyeong671 commented 2 years ago

api자체에 유동자산같은 상위 account_nm이 없는 경우에는 직접 bs_tree에 있는 키 값으로 모델을 만들어야 할 것 같음..(이름이 다른 경우랑 분리해서 생각해야 할 것 같네)