Files
DeepStock/StockCrawler.py
dsyoon f4ca3834cc init
2024-10-16 23:25:46 +09:00

170 lines
5.1 KiB
Python

import os
import sys
import time
import shutil
from datetime import datetime
from dateutil.relativedelta import relativedelta
from stock.crawler.FnGuideCrawler import FnGuideCrawler
from stock.crawler.MetaCrawler import MetaCrawler
from stock.crawler.StockCrawler import StockCrawler
from AnalyzerSqlite import AnalyzerSqlite
class StockCrawlerDaily:
PROJECT_HOME = None
def __init__(self, PROJECT_HOME):
self.PROJECT_HOME = PROJECT_HOME
return
def findCandidates(sefl, PROJECT_HOME):
RESOURCE_PATH = os.path.join(PROJECT_HOME, 'resources')
stockFileName = os.path.join(RESOURCE_PATH, 'stock.db')
analyzer = AnalyzerSqlite(stockFileName)
analyzer.analyzeDaily()
analyzer.analyzeGrouping("weekly")
analyzer.analyzeGrouping("monthly")
# HTML 출력
outPath = os.path.join(PROJECT_HOME, "resources", "analysis")
if not os.path.isdir(outPath):
os.mkdir(outPath)
day = datetime.today().strftime("%Y%m%d")
before_7_day = datetime.today() + relativedelta(days=-7)
dayList = os.listdir(outPath)
for dayDir in dayList:
if dayDir[0] != '.' and dayDir < before_7_day.strftime("%Y%m%d"):
if os.path.exists(os.path.join(outPath, dayDir)) and os.path.isdir(os.path.join(outPath, dayDir)):
shutil.rmtree(os.path.join(outPath, dayDir))
outPath = os.path.join(outPath, day)
if os.path.isdir(outPath):
shutil.rmtree(outPath)
os.mkdir(outPath)
print("print to Html...")
analyzer.findCandidates(outPath)
return
def crawl(self):
START_DATE = "2000.01.01"
RESOURCE_PATH = os.path.join(self.PROJECT_HOME, 'resources')
stockFileName = os.path.join(RESOURCE_PATH, 'stock.db')
ERROR_COUNT = 0
while ERROR_COUNT < 3:
try:
# 재무제표는 3개월마다 다운로드를 한다.
fnGuideCrawler = FnGuideCrawler(START_DATE)
print("[KOSPI 상장기업 재무제표 다운로드]")
fnGuideCrawler.crawl_fnguide(stockFileName)
break
except:
ERROR_COUNT += 1
continue
if ERROR_COUNT >= 3:
exit()
metaCrawler = MetaCrawler(START_DATE)
ERROR_COUNT = 0
while ERROR_COUNT < 3:
try:
print("\n[증시자금동향 (신용잔고, 펀드자금 잔고)]")
metaCrawler.crawl_money_trend(stockFileName)
break
except:
ERROR_COUNT += 1
continue
if ERROR_COUNT >= 3:
exit()
ERROR_COUNT = 0
while ERROR_COUNT < 3:
try:
print("\n[국내 시장금리]")
metaCrawler.crawl_interest_rates(stockFileName)
break
except:
ERROR_COUNT += 1
continue
if ERROR_COUNT >= 3:
exit()
ERROR_COUNT = 0
while ERROR_COUNT < 3:
try:
print("\n[투자자별 매매동향(Trading_Trend)]")
metaCrawler.crawl_trading_trend(stockFileName)
break
except:
ERROR_COUNT += 1
continue
if ERROR_COUNT >= 3:
exit()
ERROR_COUNT = 0
while ERROR_COUNT < 3:
try:
print("\n[환율 (USD, JPY, EUR, CNY, HKD, GBP, CAD, CHF, AUD, THB, INR, PHP, BRL, VND, RUB, TWD')]")
metaCrawler.crawl_exchange(stockFileName)
break
except:
ERROR_COUNT += 1
continue
if ERROR_COUNT >= 3:
exit()
ERROR_COUNT = 0
while ERROR_COUNT < 3:
try:
print("\n[원유 (WTI), 국제금, COPPER, NATURALGAS, CORN, SOYBEAN 등]")
metaCrawler.crawl_meterials(stockFileName)
break
except:
ERROR_COUNT += 1
continue
if ERROR_COUNT >= 3:
exit()
stockCrawler = StockCrawler(START_DATE)
print("\n[국내 종목 수집]")
stockCrawler.crawl_stocks(stockFileName)
print("\n[국내 ETF 수집]")
stockCrawler.crawl_etf_stocks(stockFileName)
print("\n[US 종목 수집]")
stockCrawler.crawl_special_stocks(stockFileName)
return
if __name__ == "__main__":
# DB Browser for SQLite: http://hleecaster.com/python-sqlite3/
if len(sys.argv) == 2:
PROJECT_HOME = sys.argv[1]
else:
PROJECT_HOME = os.getcwd()
START_DATE = "2000.01.01"
stockCrawlerDaily = StockCrawlerDaily(PROJECT_HOME)
week = datetime.today().weekday()
if week in (0, 1, 2, 3, 4): # 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일
start = time.time()
stockCrawlerDaily.crawl()
print("\n[후보 결정]")
stockCrawlerDaily.findCandidates(PROJECT_HOME)
today = datetime.now().strftime("%Y-%m-%d")
print("time : %6.2f", (time.time() - start))
print("done...")