반응형
이번에는 네이버 금융에서 -> 내 DB로 주식시세를 가져오겠습니다.
def read_naver(self, code, company, pages_to_fetch):
"""네이버에서 주식 시세를 읽어서 데이터프레임으로 반환"""
try:
url = f"http://finance.naver.com/item/sise_day.nhn?code={code}"
with urlopen(url) as doc:
#url 속 데이터를 doc 변수에 저장해준다.
if doc is None:
#아무것도 url 속에 없다면 none 반환.
return None
html = BeautifulSoup(doc, "lxml")
pgrr = html.find("td", class_="pgRR")
#html이라고 별명을 지어준 페이지 파싱 뷰티풀 수프를 이용해 페이지의 마지막 수를 구한다.
if pgrr is None:
return None
s = str(pgrr.a["href"]).split('=')
lastpage = s[-1]
#네이버 금융 시세 마지막 페이지를 구한다.
df = pd.DataFrame()
pages = min(int(lastpage), pages_to_fetch)
#설정 파일 페이지 수와 네이버 금융 페이지를 비교하여 작은걸 선택한다.
for page in range(1, pages + 1):
pg_url = '{}&page={}'.format(url, page)
df = df.append(pd.read_html(pg_url, header=0)[0])
#일별 시세를 데이터프레임에 추가한다.
tmnow = datetime.now().strftime('%Y-%m-%d %H:%M')
print('[{}] {} ({}) : {:04d}/{:04d} pages are downloading...'.
format(tmnow, company, code, page, pages), end="\r")
df = df.rename(columns={'날짜':'date','종가':'close','전일비':'diff'
,'시가':'open','고가':'high','저가':'low','거래량':'volume'})
#칼럼명을 영문으로 바꾼다.
df['date'] = df['date'].replace('.', '-')
df = df.dropna()
df[['close', 'diff', 'open', 'high', 'low', 'volume']] = df[['close',
'diff', 'open', 'high', 'low', 'volume']].astype(int)
df = df[['date', 'open', 'high', 'low', 'close', 'diff', 'volume']]
#데이터프레임을 만든다.
except Exception as e:
print('Exception occured :', str(e))
return None
return df
try except문으로 예외처리하여
HTTP 에러에 대비합니다.
결론적으로
판다스의 데이터 프레임이 적용되고,
페이지의 마지막 값이 반영되고
칼럼을 영어로 바꾼
df (데이터프레임)이 반환됩니다.
이제 읽어온 시세를 DB에 저장합시다.
def replace_into_db(self, df, num, code, company):
"""네이버에서 읽어온 주식 시세를 DB에 REPLACE"""
with self.conn.cursor() as curs:
for r in df.itertuples():
#데이터프레임을 튜플로 순회처리한다.
sql = f"REPLACE INTO daily_price VALUES ('{code}', "\
f"'{r.date}', {r.open}, {r.high}, {r.low}, {r.close}, "\
f"{r.diff}, {r.volume})"
curs.execute(sql) #sql에 df으로 받은 테이블을 저장하고, 업데이트한다.
self.conn.commit()
print('[{}] #{:04d} {} ({}) : {} rows > REPLACE INTO daily_'\
'price [OK]'.format(datetime.now().strftime('%Y-%m-%d'\
' %H:%M'), num+1, company, code, len(df)))
코드 작성 후 엔터를 눌렀을 때 done이 나오면 정상입니다.
반응형
'코딩 공부 > python' 카테고리의 다른 글
파이썬 생활 프로그래밍: 파이썬으로 CSV 읽고 쓰기 (0) | 2022.02.25 |
---|---|
json 파일을 이용해 업데이트 페이지 수 수정하기 (0) | 2022.02.23 |
기업 목록 내 DB에 저장하기 (0) | 2022.02.21 |
시세조회 API 사용하기 (0) | 2022.02.18 |
각 사이트의 주식 데이터 비교하기 (야후 파이낸스의 문제점??) (0) | 2022.02.16 |
댓글