From f04ba879e705943ab1d073bf282f73b71e88be51 Mon Sep 17 00:00:00 2001 From: KWON Date: Fri, 27 Jun 2025 11:52:04 +0900 Subject: [PATCH] =?UTF-8?q?=EC=98=A4=EB=A5=98=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/weather_capture.py | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/data/weather_capture.py b/data/weather_capture.py index 819120d..8dd1a9a 100644 --- a/data/weather_capture.py +++ b/data/weather_capture.py @@ -13,38 +13,44 @@ script_dir = os.path.dirname(os.path.abspath(__file__)) # 브라우저 옵션 설정 options = Options() options.add_argument('--headless') -options.add_argument('--disable-gpu') -options.add_argument('--no-sandbox') -options.add_argument('--disable-dev-shm-usage') +options.add_argument('--window-size=1802,1467') -# 드라이버 실행 driver = webdriver.Chrome(options=options) -driver.set_window_size(1802, 1467) # 명시적으로 창 크기 설정 - -# 날씨 페이지 접속 driver.get('https://www.weather.go.kr/w/weather/forecast/short-term.do#dong/4148026200/37.73208578534846/126.79463099866948') wait = WebDriverWait(driver, 10) -# 첫 번째 탭 클릭 (날씨 탭 전환) +# 첫 번째 탭 클릭 (안전하게 element_to_be_clickable 사용) tab_button = wait.until(EC.element_to_be_clickable( (By.XPATH, '//*[@id="digital-forecast"]/div[1]/div[3]/div[1]/div/div/a[2]') )) tab_button.click() -# 두 번째 항목 클릭 (다시 찾기: 클릭 이후 DOM 변경되므로) -list_button = wait.until(EC.element_to_be_clickable( - (By.XPATH, '//*[@id="digital-forecast"]/div[1]/div[3]/ul/div[1]/a[2]') -)) -list_button.click() +# 두 번째 항목 클릭 (stale element 대비해서 클릭 직전 다시 찾기) +list_button_xpath = '//*[@id="digital-forecast"]/div[1]/div[3]/ul/div[1]/a[2]' +for attempt in range(3): # 최대 3번 재시도 + try: + list_button = wait.until(EC.element_to_be_clickable((By.XPATH, list_button_xpath))) + list_button.click() + break + except Exception as e: + print(f"시도 {attempt+1}: 오류 발생 - {e}. 재시도 중...") + time.sleep(1) +else: + print("요소 클릭 실패. 스크립트 종료.") + driver.quit() + exit(1) + +time.sleep(2) # 클릭 후 페이지 반영 대기 # 캡처 대상 요소 찾기 target_element = wait.until(EC.presence_of_element_located( - (By.XPATH, '/html/body/div[2]/section/div/div[2]'))) + (By.XPATH, '/html/body/div[2]/section/div/div[2]') +)) # 파일 저장 경로 설정 -timestamp = datetime.now().strftime('%Y%m%d') # 날짜만 표시 +timestamp = datetime.now().strftime('%Y%m%d') save_path = os.path.join(script_dir, f'weather_capture_{timestamp}.png') # 요소 스크린샷 저장