금융
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