import os, sys import time import shutil from datetime import datetime, timedelta from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) # ๊ฒฝ๋กœ ์„ค์ • BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) DOWNLOAD_DIR = os.path.join(BASE_DIR, 'data') from lib.common import load_config, get_logger, wait_download_complete # ๐Ÿ’ก ์—ฌ๊ธฐ์„œ ๋‚ ์งœ ์ˆ˜๋™ ์„ค์ • START_DATE_STR = '2021-05-11' END_DATE_STR = '2021-05-31' # datetime ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ start_date = datetime.strptime(START_DATE_STR, '%Y-%m-%d') end_date = datetime.strptime(END_DATE_STR, '%Y-%m-%d') # ๋กœ๊ฑฐ ์„ค์ • logger = get_logger('upsolution') def login(driver, config): logger.info("์‚ฌ์ดํŠธ ์ ‘์† ๋ฐ ๋กœ๊ทธ์ธ ์‹œ๋„") driver.get("https://asp.upsolution.co.kr/") driver.find_element(By.XPATH, '/html/body/form/div/div/div[2]/div[2]/input').send_keys(config['upsolution']['id']) driver.find_element(By.XPATH, '/html/body/form/div/div/div[2]/div[3]/input').send_keys(config['upsolution']['code']) driver.find_element(By.XPATH, '/html/body/form/div/div/div[2]/div[4]/input').send_keys(config['upsolution']['pw']) login_btn_xpath = '/html/body/form/div/div/div[2]/div[6]/div/button' WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, login_btn_xpath)) ) driver.find_element(By.XPATH, login_btn_xpath).click() logger.info("๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์™„๋ฃŒ") def set_date_range(driver, start_date, end_date): logger.info(f"๋‚ ์งœ ์„ค์ •: {start_date.strftime('%Y-%m-%d')} ~ {end_date.strftime('%Y-%m-%d')}") driver.get("https://asp.upsolution.co.kr/SalesReport/SalesByReceiptDetail/100482") WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '/html/body/div[6]/div/div/div[11]/div[2]/div[2]/div/dl[1]/dd/span[1]/span/input')) ) start_input = driver.find_element(By.XPATH, '/html/body/div[6]/div/div/div[11]/div[2]/div[2]/div/dl[1]/dd/span[1]/span/input') end_input = driver.find_element(By.XPATH, '/html/body/div[6]/div/div/div[11]/div[2]/div[2]/div/dl[1]/dd/span[2]/span/input') start_input.clear() start_input.send_keys(start_date.strftime('%Y-%m-%d')) end_input.clear() end_input.send_keys(end_date.strftime('%Y-%m-%d')) # ์กฐํšŒ ํด๋ฆญ driver.find_element(By.XPATH, '/html/body/div[6]/div/div/div[11]/div[2]/div[2]/div/div/div/a[1]').click() logger.info("์กฐํšŒ ๋ฒ„ํŠผ ํด๋ฆญ") time.sleep(2) def get_item_count(driver): try: count_text = driver.find_element(By.XPATH, '/html/body/div[6]/div/div/div[11]/div[2]/div[3]/div/div[4]/span').text count = int(count_text.split('of')[1].split('items')[0].strip().replace(',', '')) logger.info(f"์•„์ดํ…œ ์ˆ˜: {count}") return count except: logger.warning("์•„์ดํ…œ ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•จ, 0์œผ๋กœ ์ฒ˜๋ฆฌ") return 0 def download_excel(driver): logger.info("์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ ํด๋ฆญ") driver.find_element(By.XPATH, '/html/body/div[6]/div/div/div[11]/div[2]/div[2]/div/div/div/a[2]').click() def move_and_rename_file(download_dir, start_date, end_date): downloaded_file = wait_download_complete(download_dir, ".xls") new_name = f"sales_{start_date.strftime('%Y%m%d')}_{end_date.strftime('%Y%m%d')}.xls" target_path = os.path.join(download_dir, new_name) shutil.move(downloaded_file, target_path) logger.info(f"[DONE] ํŒŒ์ผ ์ €์žฅ ์™„๋ฃŒ: {target_path}") def main(): config = load_config() chrome_options = Options() chrome_options.add_experimental_option('prefs', { "download.default_directory": DOWNLOAD_DIR, "download.prompt_for_download": False, "safebrowsing.enabled": True }) options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36') driver = webdriver.Chrome(options=chrome_options) try: login(driver, config) start = start_date end = end_date while True: set_date_range(driver, start, end) count = get_item_count(driver) if count <= 20000: download_excel(driver) time.sleep(5) move_and_rename_file(DOWNLOAD_DIR, start, end) break else: diff_days = (end - start).days logger.warning(f"{count}๊ฑด ์ดˆ๊ณผ โ†’ ๋‚ ์งœ ๋ฒ”์œ„ ์ถ•์†Œ ํ•„์š” ({diff_days}์ผ)") if diff_days > 10: end = start + timedelta(days=10) elif diff_days > 5: end = start + timedelta(days=5) elif diff_days > 1: end = start + timedelta(days=1) else: logger.info("์ด๋ฏธ 1์ผ ๋ฒ”์œ„, ๋ฐ”๋กœ ๋‹ค์šด๋กœ๋“œ ์‹œ๋„") download_excel(driver) time.sleep(5) move_and_rename_file(DOWNLOAD_DIR, start, end) break finally: driver.quit() logger.info("๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ") if __name__ == "__main__": main()