본문 바로가기
크롤링/파이썬 주식 크롤링

[파이썬을 이용한 주식 크롤링] 6.증권플러스 재무제표 가져오기 (4)

by 만다린망고 2020. 7. 24.
반응형

[파이썬을 이용한 주식 크롤링] 6.증권플러스 재무제표 가져오기 (4)


지난시간에 문제가 생겼었습니다. 날짜를 단순히 연도만 남긴 숫자로 만들었기 때문에 분기로 할 경우 x값이 중복되었는데요. x값을 시계열로 바꿔주겠습니다. 


먼저 원리를 간단히 설명하겠습니다. 


우리가 크롤링해온 날짜데이터는 아래와 같습니다. 


2009-09-01T00:00:00.000+00:00


위 데이터에서 연,월,일만 가져와서 시계열데이터로 만들어줄 것입니다. 아래 코드를 사용합니다. 


datetime.strptime(tab.baseDate[i][0:10],'%Y-%m-%d')


0:10은 2009-09-01 까지 가져오는 것을 의미하고, 뒤에 %Y-%m-%d 는 입력된 형식입니다. 연,월,일이 - 로 구분되어있다는 의미입니다. 


datetime.strptime 함수를 사용합니다. 아래 코드로 함수를 호출했습니다.


from datetime import datetime


datetime 모듈 안에 같은 이름의 함수가 있기 때문입니다.


아래는 전체 코드입니다. 바뀐 부분을 빨간식으로 표시하였습니다. 


stem 그래프로 그려보았습니다. 산점도에서 점을 x축까지 세로선으로 연결한 그래프입니다. 산점도인데 막대그래프처럼 보이게 됩니다. 


import json

import urllib.request as req 

import pandas as pd

import requests

import matplotlib

from bs4 import BeautifulSoup

from matplotlib import pyplot as plt

from matplotlib import font_manager, rc

from datetime import datetime


#종목코드

item_code='005390'

#분기 or 연도 선택

yorq='quarterly'

#궁금한 지표

output='per'


#재무데이터 가져오기, %s 를 이용하여 종목을 변수로 입력

myurl='https://stockplus.com/api/companies/KOREA-A%s/financial_statements.json'

myurl=myurl % item_code

data= req.urlopen(myurl).read()

dataj = json.loads(data.decode('utf-8'))

tab=pd.DataFrame(dataj[yorq])



#연도데이터중 연,월,일 만 인덱싱해서 시계열데이터로

for i in range(len(tab.baseDate)):

    tab.baseDate[i]= datetime.strptime(tab.baseDate[i][0:10],'%Y-%m-%d')


#종목 이름 가져오기

url_name=requests.get("https://finance.naver.com/item/main.nhn?code=005930").text

soup=BeautifulSoup(url_name,"html.parser")

name=soup.select("div.wrap_company a")[0].get_text()


#한글 출력 가능하게함

my_font = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()

rc('font', family=my_font)


#x,y값 설정

x=tab.baseDate

y=tab[output]


#그래프 그리기

#마이너스 부호 사용

matplotlib.rcParams['axes.unicode_minus'] = False

plt.xticks(rotation=90)


#stem 함수 이용해서 세로선 만듦

markerline, stemlines, baseline =plt.stem(x,y,markerfmt=' ',basefmt="m")

plt.setp(baseline, 'linewidth', 0)

plt.setp(stemlines, 'linewidth', 5)


plt.xticks(fontsize =8) #x 눈금 레이블 크기

plt.gca().xaxis.set_major_locator(matplotlib.dates.MonthLocator([3,6,9,12])) #3,6,9,12월만 눈금으로

plt.gca().xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%Y-%m")) #눈금 레이블 형태

plt.title(name+' '+output)

plt.show()


반응형

댓글