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')
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
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
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
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
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
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