feat: 10장 전 종목 주가 크롤링 추가
This commit is contained in:
		
							parent
							
								
									567c5fc2cc
								
							
						
					
					
						commit
						6da91bb0bd
					
				
							
								
								
									
										98
									
								
								example/10-stock-price.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								example/10-stock-price.py
									
									
									
									
									
										Normal file
									
								
							| @ -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() | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user