# 패키지 불러오기 import time from datetime import date from io import BytesIO import pandas as pd import requests as rq from dateutil.relativedelta import relativedelta from tqdm import tqdm import quantcommon # DB 연결 common = quantcommon.QuantCommon() engine = common.create_engine() con = common.connect() 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()