Instantly share code, notes, and snippets.
Created
June 17, 2017 09:09
-
Star
(0)
0
You must be signed in to star a gist -
Fork
(0)
0
You must be signed in to fork a gist
-
Save KimMyungSam/68a1d5c19435c9d51965fbbfda2ccf41 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"deletable": true, | |
"editable": true, | |
"slideshow": { | |
"slide_type": "slide" | |
} | |
}, | |
"source": [ | |
"네이버 파이낸스에서 재무제표 데이터를 크롤링 하기 위해 알아야 할 정보는 아래 URL이 전부다.\n", | |
"\n", | |
"http://companyinfo.stock.naver.com/v1/company/ajax/cF1001.aspx?cmp_cd=105560&fin_typ=0&freq_typ=Y\n", | |
"\n", | |
"URL을 구성하는 파라미터의 의미는 다음과 같다.\n", | |
"\n", | |
"인자 | 의미 | 값\n", | |
"-- | -- | --\n", | |
"cmp_cd | 종목코드 | 005930 (종목코드)\n", | |
"fin_typ | 재무제표 타입 | 0: 주재무제표, 1: GAAP개별, 2: GAAP연결, 3: IFRS별도, 4:IFRS연결\n", | |
"freq_typ | 기간 | Y:년, Q:분기" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"slideshow": { | |
"slide_type": "-" | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"import re\n", | |
"from datetime import datetime\n", | |
"import pandas as pd\n", | |
"import requests\n", | |
"from bs4 import BeautifulSoup\n", | |
"\n", | |
"'''\n", | |
"get_date_str(s) - 문자열 s 에서 \"YYYY/MM\" 문자열 추출\n", | |
"'''\n", | |
"def get_date_str(s):\n", | |
" date_str = ''\n", | |
" r = re.search(\"\\d{4}/\\d{2}\", s)\n", | |
" if r:\n", | |
" date_str = r.group()\n", | |
" date_str = date_str.replace('/', '-')\n", | |
"\n", | |
" return date_str\n", | |
"\n", | |
"def save_naverFS(df,code):\n", | |
" df['code'] = code\n", | |
" df.to_sql('naverfs', con, if_exists = 'append')\n", | |
" return None\n", | |
" \n", | |
"'''\n", | |
"* code: 종목코드\n", | |
"* fin_type = '0': 재무제표 종류 (0: 주재무제표, 1: GAAP개별, 2: GAAP연결, 3: IFRS별도, 4:IFRS연결)\n", | |
"* freq_type = 'Y': 기간 (Y:년, Q:분기)\n", | |
"'''\n", | |
"def get_finstate_naver(code, fin_type='0', freq_type='Y'):\n", | |
" url_tmpl = 'http://companyinfo.stock.naver.com/v1/company/ajax/cF1001.aspx?' \\\n", | |
" 'cmp_cd=%s&fin_typ=%s&freq_typ=%s'\n", | |
"\n", | |
" url = url_tmpl % (code, fin_type, freq_type)\n", | |
" #print(url)\n", | |
"\n", | |
" dfs = pd.read_html(url, encoding=\"utf-8\")\n", | |
" df = dfs[0]\n", | |
" if df.ix[0,0].find('해당 데이터가 존재하지 않습니다') >= 0:\n", | |
" return None\n", | |
"\n", | |
" df.rename(columns={'주요재무정보':'date'}, inplace=True)\n", | |
" df.set_index('date', inplace=True)\n", | |
"\n", | |
" cols = list(df.columns)\n", | |
" if '연간' in cols: cols.remove('연간')\n", | |
" if '분기' in cols: cols.remove('분기')\n", | |
" cols = [get_date_str(x) for x in cols]\n", | |
" df = df.ix[:, :-1]\n", | |
" df.columns = cols\n", | |
" dft = df.T\n", | |
" dft.index = pd.to_datetime(dft.index)\n", | |
"\n", | |
" # remove if index is NaT\n", | |
" dft = dft[pd.notnull(dft.index)]\n", | |
" \n", | |
" #종목별 컬럼name 오류를 수정함\n", | |
" dft.rename(columns={'유보율': '자본유보율'}, inplace=True)\n", | |
" dft.rename(columns={'현금배당성향': '현금배당성향(%)'}, inplace=True)\n", | |
" \n", | |
" return dft" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"deletable": true, | |
"editable": true, | |
"scrolled": false, | |
"slideshow": { | |
"slide_type": "subslide" | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"import mysql.connector\n", | |
"import sqlalchemy\n", | |
"from sqlalchemy import create_engine\n", | |
"import pandas as pd\n", | |
"\n", | |
"if __name__ == \"__main__\":\n", | |
" dir = 'D:/naver/FS/'\n", | |
" year = '2017' \n", | |
" \n", | |
" pwd = 'rlaehgus1'\n", | |
" engine = create_engine('mysql+mysqlconnector://root:'+pwd+'@localhost/findb', echo=False)\n", | |
" con = engine.connect()\n", | |
" \n", | |
" sql = 'SELECT * FROM listed_company'\n", | |
" comp_code = pd.read_sql(sql, con=engine)\n", | |
"\n", | |
" for inx, row in comp_code.iterrows():\n", | |
" code = row['code']\n", | |
" \n", | |
" # 네이버금융 데이터에서 재주재표 정보 가져오기\n", | |
" df = get_finstate_naver(code)\n", | |
" \n", | |
" if df is not None:\n", | |
" # db전체를 저장\n", | |
" save_naverFS(df,code) \n", | |
" \n", | |
" # csv파일로 저장\n", | |
" fname = dir + year + '_ifrs_con_' + code + '.csv'\n", | |
" df.to_csv(fname)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"naver colums(\n", | |
"['매출액', '영업이익', '세전계속사업이익', '당기순이익', '당기순이익(지배)', \n", | |
"'당기순이익(비지배)', '자산총계', '부채총계', '자본총계', '자본총계(지배)', \n", | |
"'자본총계(비지배)', '자본금', '영업활동현금흐름', '투자활동현금흐름', \n", | |
"'재무활동현금흐름', 'CAPEX', 'FCF', '이자발생부채', '영업이익률', '순이익률',\n", | |
"'ROE(%)','ROA(%)', '부채비율', '자본유보율', 'EPS(원)', 'PER(배)', 'BPS(원)',\n", | |
"'PBR(배)','현금DPS(원)', '현금배당수익률', '현금배당성향(%)', '발행주식수(보통주)'],\n", | |
"dtype='object', name='주요재무정보')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"##### data 디렉토리의 \"naver_finstate_\" + 아래 표의 이름을 붙여 디렉토리를 지정\n", | |
"\n", | |
"##### 디렉토리 문자열\t설명\t기간\n", | |
"##### year_gaap\tGAAP\t년\n", | |
"##### year_ifrs_con\tIFRS 연결\t년\n", | |
"##### year_ifrs_sep\tIFRS 별도\t년\n", | |
"##### quater_gaap\tGAAP\t분기\n", | |
"##### quater_ifrs_con\tIFRS 연결\t분기\n", | |
"##### quater_ifrs_sep\tIFRS 별도\t분기" | |
] | |
} | |
], | |
"metadata": { | |
"celltoolbar": "Slideshow", | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.0" | |
}, | |
"nikola": { | |
"category": "dev", | |
"date": "2017-02-25 02:30:35 UTC+09:00", | |
"description": "네이버 파이낸스 사이트에서 재무제표 크롤링", | |
"link": "", | |
"slug": "naver-finance-finstate-crawling", | |
"tags": "crawling, naver", | |
"title": "네이버 파이낸스 - 재무제표 크롤링", | |
"type": "text" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment