Skip to content

Instantly share code, notes, and snippets.

@KimMyungSam
Created June 17, 2017 09:09
Show Gist options
  • Save KimMyungSam/68a1d5c19435c9d51965fbbfda2ccf41 to your computer and use it in GitHub Desktop.
Save KimMyungSam/68a1d5c19435c9d51965fbbfda2ccf41 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"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