본문 바로가기
파이썬 (투자분석용)/Pandas 및 python 일반

[python] 네이버금융 주요 재무정보 스크래핑

by amAToRoi 2022. 2. 26.
반응형

사경인 회계사는 "재무제표를 모르면 주식투자 절대로 하지마라" 라는 제목으로 책을 집필한 바 있다. 사 회계사의 의도는 책을 찬찬히 읽어본 이후에야 알 수 있겠지만, 핵심적인 사항은 주식투자 대상을 선정함에 있어 해당 기업의 사업모델과 미래 가치를 평가할 때 재무정보를 빼놓지 않아야 한다는 것이다.

 

1. 재무정보를 보기 쉬운 방법

포털사이트는 재무정보를 얻기 가장 쉬운 곳 중 하나이다. 에프앤가이드와 같은 재무정보 제공회사를 통해 비용을 지불하고 정제된 데이터를 무료로 제공하고 있기 때문이다. 우리나라의 대표적인 포털사이트인 네이버와 다음(Daum)은 FnGuide를 통해 같은 수준의 정보를 제공하고 있다.

네이버금융과 다음금융의 재무정보제공다음금융의 재무정보제공
네이버금융(left)과 다음금융(right)에서 제공하는, FnGuide의 종목별 재무정보 정제데이터

네이버나 다음과 같은 포털사이트가 접근하기 가장 편리한 사이트이겠지만, 이 두 사이트의 원문을 보고 싶다면 아래의 링크로 들어가보기 바란다.

https://comp.fnguide.com/

 

삼성전자(A005930) | Snapshot | 기업정보 | Company Guide

삼성전자 005930 | <!-- SamsungElec | --> 홈페이지 홈페이지http://www.samsung.com 전화번호 전화번호031-200-1114 | IR 담당자 02-2255-9000 주소 주소경기도 수원시 영통구 삼성로 129 (매탄동) KSE  코스피 전기,전

comp.fnguide.com

아울러, 에프엔가이드(FnGuide)는 사업보고서(분기/결산)를 정제하여 이와 같은 데이터로 정제하고 있으므로, 정~말 원문을 보고 싶다면 Dart 전자공시시스템으로 접속하기 바란다. 참고로, 이 사이트에서는 api를 제공하고 있다.

https://dart.fss.or.kr/

 

전자공시시스템

많이 본 문서 최근 3영업일 기준 가장 많이 본 공시를 보여줍니다.

dart.fss.or.kr

 

 

2. 네이버금융 스크래핑

위 이미지에서 볼 수 있는 정보를 엑셀, Python 등으로 분석하기 위해 웹의 정보를 스크래핑하는 코드를 작성했다. 각종 주석을 포함해서 불과 51줄에 불과하며 주석으로 충분한 전달이 될 것이라고 믿기에 별도로 설명하지 않는다.

코드 output 샘플

유한양행 주요재무 스크래핑
아래 코드를 돌리면 이 같은 결과가 나온다

스크래핑으로인한 과도한 서버 부하를 유발하거나, 해당 사이트의 정보를 스크래핑하여 동일한 사업모델로 수익활동을 이행하는 것은 불법으로 규정된 바 있습니다. 또한, 서버 부하의 수준은 해당 사이트에서 결정함을 고려하시기 바랍니다.
아울러, FnGuide에서는 이 콘텐츠에 대해 저작권을 가지고 있으며, "사전 허가없이 이를 무단으로 사용하거나, 데이터 베이스화 할 경우 민형사상 책임을 물을 수 있습니다."라고 경고하고 있음에 유의하시기 바랍니다.
# -*- coding:UTF-8 -*-

import pandas
import requests
import re

# Naver 금융의 주요 재무제표 가져오기, 네이버금융-특정종목-종목분석-financial summary
def GetNvrFinData(code='005930', freqTyp = 'A'):
    '''
        code : 종목코드
        freqTyp (연간 = 'Y', 분기 = 'Q', 복합 = 'A')

        output 형식 : Pandas DataFrame,
                      parsing 방법을 변경하려면
                      rawhtml 정의 다음 부터 변경할 것
    '''
    # parameter 정의 부분
    encParam, enc_id = GetNvrEncparam(code)
    url = 'https://navercomp.wisereport.co.kr/v2/company/ajax/cF1001.aspx'
    params = {
      'cmp_cd': code,
      'fin_typ': '0',
      'freq_typ': freqTyp,
      'encparam': encParam,
      'id': enc_id
    }
    rawHtml = requests.get(url, params=params).text

    # Pandas, read_html로 parsing
    fs = pandas.read_html(rawHtml)[1]
    fs.columns = fs.columns.droplevel(0) # 불필요할 멀티-컬럼 삭제
    fs.set_index('주요재무정보', inplace=True)
    return fs.copy()

# Naver 금융의 스크래핑을 위한 encparam 값과 id 값 가져오기
def GetNvrEncparam(code="005930"):
    '''
        usage : encPrm, encId = GetNvrEncparam('005930')
    '''
    re_enc = re.compile("encparam: '(.*)'", re.IGNORECASE)
    re_id = re.compile("id: '([a-zA-Z0-9]*)' ?", re.IGNORECASE)
    url = f"https://navercomp.wisereport.co.kr/v2/company/c1010001.aspx?cmp_cd={code}"
    html = requests.get(url).text
    encparam = re_enc.search(html).group(1)
    encid = re_id.search(html).group(1)
    return encparam, encid

if __name__ == '__main__':
    pcode = '000100'
    a = GetNvrFinData(pcode)
    print(a)

 

반응형

댓글