Example #1
0
 def _get_report(self):
     """ 보고서 html 불러오기"""
     payload = dict(rcpNo=self.rcp_no)
     if self.dcm_no:
         payload['dcmNo'] = self.dcm_no
     resp = request.get(url=self._REPORT_URL_, payload=payload, referer=self._DART_URL_)
     self.html = BeautifulSoup(resp.text, 'html.parser')
Example #2
0
def api_request(path: str, corp_code: str, bsns_year: str = None, reprt_code: str = None) -> dict:
    """ API Request Helper

    Parameters
    ----------
    path: str
        API Path
    corp_code: str
        Corporation Code (8 digits)
    bsns_year: str, optional
        Year (4 digits)
    reprt_code: str, optional
        Report code( Q1: 11013, half: 11012, Q3: 11014, Annual: 11011)

    Returns
    -------
    dict
        API Request Result
    """

    if corp_code and corp_code_checker.search(corp_code) is None:
        raise ValueError('corp_code must be 8 digits')

    if bsns_year and bsns_year_checker.search(bsns_year) is None:
        raise ValueError('bsns_year must be 4 digits')

    if reprt_code and reptr_code_checker.search(reprt_code) is None:
        raise ValueError('invalid reprt_code')

    # Open DART Base URL
    base = 'https://opendart.fss.or.kr/'
    # Request URL
    url = urljoin(base, path)

    # Get DART_API_KEY
    api_key = get_api_key()

    # Set payload
    payload = {
        'crtfc_key': api_key,
        'corp_code': corp_code,
        'bsns_year': bsns_year,
        'reprt_code': reprt_code,
    }

    # Request Data
    resp = request.get(url=url, payload=payload)

    # Convert Response to json
    dataset = resp.json()

    # Status Code Check
    check_status(**dataset)
    return dataset
Example #3
0
def get_multi_corp(corp_code: Union[str, List[str]], bsns_year: str,
                   reprt_code: str):
    """ 다중회사 주요계정 조회

    Parameters
    ----------
    corp_code: str or list of str
        공시대상회사의 고유번호(8자리) ex) ['00356370','00334624']
    bsns_year: str
        사업연도(4자리)
    reprt_code: str
        1분기보고서 : 11013, 반기보고서 : 110123, 3분기보고서 : 11014, 사업보고서 : 11011

    Returns
    -------
    dict
        다중회사 주요계정 조회 결과
    """
    if reprt_code and reptr_code_checker.search(reprt_code) is None:
        raise ValueError('invalid reprt_code')

    if bsns_year and bsns_year_checker.search(bsns_year) is None:
        raise ValueError('bsns_year must be 4 digits')

    # Open DART Base URL
    base = 'https://opendart.fss.or.kr/'

    # Path
    path = '/api/fnlttMultiAcnt.json'
    # Request URL
    url = urljoin(base, path)

    # Get DART_API_KEY
    api_key = get_api_key()

    # Set payload
    payload = {
        'crtfc_key': api_key,
        'corp_code': corp_code,
        'bsns_year': bsns_year,
        'reprt_code': reprt_code,
    }

    # Request Data
    resp = request.get(url=url, payload=payload)

    # Convert Response to json
    dataset = resp.json()

    # Status Code Check
    check_status(**dataset)

    return dataset
Example #4
0
    def api_key(self, api_key: str) -> None:
        if not isinstance(api_key, str):
            raise ValueError('The Dart Api key must be provided through the api_key variable')

        # 기업개황 테스트
        url = 'https://opendart.fss.or.kr/api/company.json'
        # 요청인자
        # crtfc_key: API 인증키
        # corp_code: 공시대항회사 고유번호 /  00126380 삼성전자
        payload = {'crtfc_key': api_key, 'corp_code': '00126380'}

        resp = request.get(url=url, payload=payload)
        data = resp.json()

        check_status(**data)
        self.__api_key = api_key
Example #5
0
    def extract_attached_files(self):
        """ 첨부된 파일 리스트 추출 및 반환

        Returns
        -------
        list of AttachedFile
            첨부된 파일리스트

        """
        if self.html is None:
            self._get_report()
        results = []
        a_href = self.html.find('a', href='#download')
        a_onclick = a_href.attrs.get('onclick', '')
        raw_data = re.search(r'openPdfDownload\(.*?(\d+).*?(\d+).*?\)',
                             a_onclick)
        if raw_data is None:
            return results

        rcp_no = raw_data.group(1)
        dcm_no = raw_data.group(2)

        payload = dict(rcp_no=rcp_no, dcm_no=dcm_no)
        resp = request.get(url=self._DOWNLOAD_URL_,
                           payload=payload,
                           referer=self._REPORT_URL_)
        referer = resp.url
        soup = BeautifulSoup(resp.text, 'html.parser')
        tr_list = soup.find_all('tr')
        attached_files = []

        for tr in tr_list:
            if tr.find('a'):
                td_list = tr.find_all('td')
                filename = td_list[0].text.strip()
                file_url = td_list[1].a.get('href')
                if not file_url:
                    continue
                info = dict()
                info['rcp_no'] = self.rcp_no
                info['url'] = file_url
                info['filename'] = filename
                info['referer'] = referer
                attached_files.append(AttachedFile(**info))
        self._attached_files = attached_files
        return self._attached_files
Example #6
0
    def load(self):
        """ page loading 함수 """
        def change_url(bs, tag):
            tags = bs.find_all(attrs={tag: re.compile(r'.*')})
            if tags:
                for t in tags:
                    t[tag] = "http://dart.fss.or.kr" + t[tag]
            return bs

        def add_prefix(match_obj):
            return r"window.open('http://dart.fss.or.kr" + match_obj.group(1) + r"'"

        payload = {
            'rcpNo': self.rcp_no,
            'dcmNo': self.dcm_no,
            'eleId': self.ele_id,
            'offset': self._offset,
            'length': self._length,
            'dtd': self._dtd
        }
        html = request.get(url=self._BASE_URL_, payload=payload, referer=self._BASE_URL_).content
        try:
            html = html.decode()
        except UnicodeDecodeError:
            html = html.decode('cp949')
        finally:
            soup = BeautifulSoup(html, 'html.parser')
            meta = soup.find('meta', {'content': re.compile(r'charset')})
            if meta:
                meta['content'] = meta['content'].replace('euc-kr', 'utf-8')

            soup = change_url(soup, 'href')
            soup = change_url(soup, 'src')

            html = str(soup)
            html = re.sub(r'window.open\(\'(.*?)\'', add_prefix, html)

            self._html = html
def search_filings(corp_code: str = None,
                   bgn_de: str = None,
                   end_de: str = None,
                   last_reprt_at: str = 'N',
                   pblntf_ty: str_or_list = None,
                   pblntf_detail_ty: str_or_list = None,
                   sort: str = 'date',
                   sort_mth: str = 'desc',
                   page_no: int = 1,
                   page_count: int = 10):
    """ 공시보고서 검색

    Parameters
    ----------
    corp_code: str, optional
        공시대상회사의 고유번호(8자리), 고유번호(corp_code)가 없는 경우 검색기간은 3개월로 제한
    bgn_de: str, optional
        검색시작 접수일자(YYYYMMDD), 없으면 종료일(end_de)
    end_de: str, optional
        검색종료 접수일자(YYYYMMDD), 없으면 당일
    last_reprt_at: str, optional
        최종보고서만 검색여부(Y or N), default : N
    pblntf_ty: str, optional
        공시유형
    pblntf_detail_ty: str, optional
        공시상세유형
    sort: str, optional
        정렬, {접수일자: date, 회사명: crp, 고서명: rpt}
    sort_mth: str, optional
        오름차순(asc), 내림차순(desc), default : desc
    page_no: int, optional
        페이지 번호(1~n) default : 1
    page_count: int, optional
        페이지당 건수(1~100) 기본값 : 10, default : 100

    Returns
    -------
    dict
        Response data
    """
    url = 'https://opendart.fss.or.kr/api/list.json'

    api_key = get_api_key()

    last_reprt_at = str_upper(last_reprt_at)
    pblntf_ty = str_upper(pblntf_ty)
    pblntf_detail_ty = str_upper(pblntf_detail_ty)

    payload = {
        'crtfc_key': api_key,
        'corp_code': corp_code,
        'bgn_de': bgn_de,
        'end_de': end_de,
        'last_reprt_at': last_reprt_at,
        'pblntf_ty': pblntf_ty,
        'pblntf_detail_ty': pblntf_detail_ty,
        'sort': sort,
        'sort_mth': sort_mth,
        'page_no': page_no,
        'page_count': page_count
    }

    resp = request.get(url=url, payload=payload)
    dataset = resp.json()

    # Check Error
    check_status(**dataset)
    return dataset
Example #8
0
def get_single_fs(corp_code: str, bsns_year: str, reprt_code: str,
                  fs_div: str):
    """ 단일회사 전체 재무제표 조회

    Parameters
    ----------
    corp_code: str
        공시대상회사의 고유번호(8자리)
    bsns_year: str
        사업연도(4자리)
    reprt_code: str
        1분기보고서 : 11013, 반기보고서 : 110123, 3분기보고서 : 11014, 사업보고서 : 11011
    fs_div: str
        CFS:연결재무제표, OFS:재무제표

    Returns
    -------
    dict
        단일회사 전체 재무제표
    """

    if corp_code_checker.search(corp_code) is None:
        raise ValueError('corp_code must be 8 digits')

    if bsns_year_checker.search(bsns_year) is None:
        raise ValueError('bsns_year must be 4 digits')

    if reptr_code_checker.search(reprt_code) is None:
        raise ValueError('invalid reprt_code')

    if fs_div_checker.search(fs_div) is None:
        raise ValueError('fs_div must be CFS or OFS')

    fs_div = fs_div.upper()

    # Open DART Base URL
    base = 'https://opendart.fss.or.kr/'

    path = '/api/fnlttSinglAcntAll.json'

    # Request URL
    url = urljoin(base, path)

    # Get DART_API_KEY
    api_key = get_api_key()

    # Set payload
    payload = {
        'crtfc_key': api_key,
        'corp_code': corp_code,
        'bsns_year': bsns_year,
        'reprt_code': reprt_code,
        'fs_div': fs_div,
    }

    # Request Data
    resp = request.get(url=url, payload=payload)

    # Convert Response to json
    dataset = resp.json()

    # Status Code Check
    check_status(**dataset)
    return dataset