-
naver 주식 자동 저장금융 2022. 12. 8. 09:48728x90
지난번에 naver 주식표를 data frame으로 가져오는 코드를 올렸었다. (https://engineerer.tistory.com/11)
이번에는 해당 함수를 이용해, 매일 / 일정시간 간격으로 / 주식 상위 list를 저장해주는 코드를 작성했다.
아래가 전체 코드이며, dataframe_from_naver는 이전 posting을 참조바란다.
import os import datetime from bs4 import BeautifulSoup as BS import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By import time global flag global del_counter def dataframe_from_naver(종류): if 종류=='급등': # 급등 종목 url = "https://finance.naver.com/sise/sise_low_up.naver?sosok=1" elif 종류=='하락': # 하락 종목 url = "https://finance.naver.com/sise/sise_fall.naver?sosok=1" elif 종류=='거래량': # 거래량 급등 종목 url = "https://finance.naver.com/sise/sise_quant.naver?sosok=1" # 옵션 생성 options = webdriver.ChromeOptions() # 창 숨기는 옵션 추가 options.add_argument("headless") ### option 설정 driver = webdriver.Chrome('chromedriver', options=options) driver.get(url) option_list = ['true', None, None, None, None, None, 'true', None, None, None, None, None, 'true', 'true', None, None, None, None, 'true', 'true', None, None, None, None, None, None, None] for index, flag in enumerate(option_list): check = driver.find_element(By.ID, "option" + str(index + 1)) if check.get_attribute('checked') != flag: check.click() button = driver.find_element(By.XPATH,'//a[@href="javascript:fieldSubmit()"]') button.click() ### # agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" # response = requests.get(url=url, headers={"User-Agent": agent}) # res_text = response.text res_text = driver.page_source parsed_res_text = BS(res_text, 'html.parser') # print(parsed_res_text) tables = parsed_res_text.find_all("table") # print(tables[1]) # temp=tables[1].find_all('td', {"class":"no"}) lines=tables[1].find_all('tr') 항목=lines[0].find_all('th') name =[] for index, l in enumerate(항목): name = name + [l.text] # print(name) data = [[],[],[],[],[],[],[],[],[],[],[],[]] 종목코드=[] for index, l in enumerate(lines): temp_data=l.find_all('td') for index2, l2 in enumerate(temp_data): # print(l2) text_temp = l2.text text_temp = text_temp.replace("\t", "") text_temp = text_temp.replace("\n", "") text_temp = text_temp.replace("+", "") text_temp = text_temp.replace("-", "") text_temp = text_temp.replace("%", "") # print(text_temp) if text_temp!="": data[index2]=data[index2]+[text_temp] temp_url=l2.find('a') if temp_url!=None: text_string = temp_url['href'] code_tmp = text_string.split("?code=") 종목코드 = 종목코드+[code_tmp[1]] # print(data) df=pd.DataFrame({"종목코드": 종목코드}) for i,temp_name in enumerate(name): if i>0: temp_dataframe=pd.DataFrame({temp_name:data[i]}) # print(temp_dataframe) df=pd.concat([df,temp_dataframe],axis=1) index=df[df['매도총잔량']=='0'].index df.drop(index,inplace=True) # print(df) 매수매도잔량비=df['매수총잔량'].str.replace(',', '').astype(float)/df['매도총잔량'].str.replace(',', '').astype(float) temp_dataframe=pd.DataFrame({'매수매도잔량비':매수매도잔량비}) df = pd.concat([df, temp_dataframe], axis=1) print(df) return df def createFolder(path): try: if not os.path.exists(path): os.makedirs(path) except : print("error") def sleep_장외(): print("장외시간") while (datetime.datetime.now().hour< 9 or datetime.datetime.now().hour>=15 or datetime.datetime.now().weekday()>4): time.sleep(10) print("장시작") def naver_parser(): option_list = ['급등','하락','거래량'] save_name_list = ['naver_종목_','naver_하락종목_','naver_거래량상위종목_'] for index, option in enumerate(option_list): while True: try: df = dataframe_from_naver(option) break except: time.sleep(1) # print(df) cur_time = datetime.datetime.now() df.to_csv(datetime.datetime.today().strftime("%y%m%d") + "/"+save_name_list[index] + cur_time.strftime("%H%M%S") + ".csv", encoding="euc-kr") if __name__ == "__main__": while datetime.datetime.now().weekday()<=4: # 장 시작전 sleep sleep_장외() # directory 설정 date = datetime.datetime.today().strftime("%y%m%d") print(date) createFolder(date) while (9<= datetime.datetime.now().hour <16): try: naver_parser() time.sleep(10) except: time.sleep(10)
추가된 함수는 아래의 세개다.
def createFolder(path): try: if not os.path.exists(path): os.makedirs(path) except : print("error")
createFolder: 데이터 저장 폴더를 만드는 함수
def sleep_장외(): print("장외시간") while (datetime.datetime.now().hour< 9 or datetime.datetime.now().hour>=15 or datetime.datetime.now().weekday()>4): time.sleep(10) print("장시작")
sleep_장외: 장외시간동안 대기하는 함수
def naver_parser(): option_list = ['급등','하락','거래량'] save_name_list = ['naver_종목_','naver_하락종목_','naver_거래량상위종목_'] for index, option in enumerate(option_list): while True: try: df = dataframe_from_naver(option) break except: time.sleep(1) # print(df) cur_time = datetime.datetime.now() df.to_csv(datetime.datetime.today().strftime("%y%m%d") + "/"+save_name_list[index] + cur_time.strftime("%H%M%S") + ".csv", encoding="euc-kr")
naver_parser: data parsing 함수를 호출 및 데이터 저장 기능.
if __name__ == "__main__": while datetime.datetime.now().weekday()<=4: # 장 시작전 sleep sleep_장외() # directory 설정 date = datetime.datetime.today().strftime("%y%m%d") print(date) createFolder(date) while (9<= datetime.datetime.now().hour <16): try: naver_parser() time.sleep(10) except: time.sleep(10)
이를 이용하여 구성한 main은 위와 같다.
while 문에는 평일에만 동작하도록 조건식을 추가하였다.
평일에도 장 시간 이외에는 sleep하도록 하였다. (sleep_장외())
sleep에서 깨어나면 날짜명으로 폴더를 만든다.
그리고 9시~16시까지 naver_parser 함수를 10초 간격으로 호출하여 저장한다.
결과는 아래와 같다.
오늘 날짜에 해당하는 폴더에 위와 같이 상승/하락종목/거래량상위 종목을 저장한다. 728x90'금융' 카테고리의 다른 글
키움 api 비밀번호 종류 (0) 2023.01.18 오전 9시 주식 단타, 정말 다를까? (2) 2022.12.10 naver 주식 web parsing (0) 2022.12.07 This version of ChromeDriver only supports Chrome version 106 (0) 2022.12.05 pykiwoom pyqt5 import 문제 (0) 2022.11.30