diff --git a/example/10-stock-price.py b/example/10-stock-price.py new file mode 100644 index 0000000..5feef79 --- /dev/null +++ b/example/10-stock-price.py @@ -0,0 +1,98 @@ +# 패키지 불러오기 +import os +from urllib.parse import quote_plus + +import pymysql +from sqlalchemy import create_engine +import pandas as pd +from datetime import date +from dateutil.relativedelta import relativedelta +import requests as rq +import time +from tqdm import tqdm +from io import BytesIO +from dotenv import load_dotenv + +load_dotenv() +user = os.getenv('DB_USER') +pw = os.getenv('DB_PW') +engine_for_pw = quote_plus(pw) +host = os.getenv('DB_HOST') +port = int(os.getenv('DB_PORT')) +db = os.getenv('DB_DB') + +# DB 연결 +engine = create_engine(f'mysql+pymysql://{user}:{engine_for_pw}@{host}:{port}/{db}') +con = pymysql.connect(user=user, + passwd=pw, + host=host, + port=port, + db=db, + charset='utf8') +mycursor = con.cursor() + +# 티커리스트 불러오기 +ticker_list = pd.read_sql(""" +select * from kor_ticker +where 기준일 = (select max(기준일) from kor_ticker) + and 종목구분 = '보통주'; +""", con=engine) + +# DB 저장 쿼리 +query = """ + insert into kor_price (날짜, 시가, 고가, 저가, 종가, 거래량, 종목코드) + values (%s,%s,%s,%s,%s,%s,%s) as new + on duplicate key update + 시가 = new.시가, 고가 = new.고가, 저가 = new.저가, + 종가 = new.종가, 거래량 = new.거래량; +""" + +# 오류 발생시 저장할 리스트 생성 +error_list = [] + +# 전종목 주가 다운로드 및 저장 +for i in tqdm(range(0, len(ticker_list))): + + # 티커 선택 + ticker = ticker_list['종목코드'][i] + + # 시작일과 종료일 + fr = (date.today() + relativedelta(years=-5)).strftime("%Y%m%d") + to = (date.today()).strftime("%Y%m%d") + + # 오류 발생 시 이를 무시하고 다음 루프로 진행 + try: + + # url 생성 + url = f'''https://fchart.stock.naver.com/siseJson.nhn?symbol={ticker}&requestType=1 + &startTime={fr}&endTime={to}&timeframe=day''' + + # 데이터 다운로드 + data = rq.get(url).content + data_price = pd.read_csv(BytesIO(data)) + + # 데이터 클렌징 + price = data_price.iloc[:, 0:6] + price.columns = ['날짜', '시가', '고가', '저가', '종가', '거래량'] + price = price.dropna() + price['날짜'] = price['날짜'].str.extract("(\d+)") + price['날짜'] = pd.to_datetime(price['날짜']) + price['종목코드'] = ticker + + # 주가 데이터를 DB에 저장 + args = price.values.tolist() + mycursor.executemany(query, args) + con.commit() + + except: + + # 오류 발생시 error_list에 티커 저장하고 넘어가기 + print(ticker) + error_list.append(ticker) + + # 타임슬립 적용 + time.sleep(2) + +# DB 연결 종료 +engine.dispose() +con.close()