ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • naver 주식 자동 저장
    금융 2022. 12. 8. 09:48
    728x90

    지난번에 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
Designed by Tistory.