# 패키지 불러오기 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()