금융

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