CodeGym /행동 /Python SELF KO /스크립트 안정성 및 오류 최소화를 위한 최적화

스크립트 안정성 및 오류 최소화를 위한 최적화

Python SELF KO
레벨 38 , 레슨 3
사용 가능

1. 성능 분석

왜 최적화가 필요할까?

강력한 자동차가 있다고 상상해봐. 3초 만에 시속 100km까지 가속할 수 있지만, 연료를 고래가 플랑크톤을 먹는 것처럼 소모한다면? 당신의 스크립트가 매우 빠르더라도, 자원과 실행 시간 면에서 너무 "탐욕적"일 수 있어. 더 나아가, 자원 "누수"는 스크립트를 불안정하게 만들어 오류를 발생시킬 수 있어. 최적화는 이러한 문제를 방지하는 데 도움을 줘.

먼저, 외과 의사가 말하듯이 "절개"를 해보자. 스크립트의 성능을 분석해서 어디에서 "고통받고" 있는지 파악해 보자.

스크립트 속도와 안정성을 테스트하는 방법

분석의 간단한 방법 중 하나는 time 같은 Python 기본 모듈을 사용하는 거야. 스크립트에 몇 줄 추가해서 어떤 작업이 가장 오래 걸리는지 파악해 보자.

Python

import time

start_time = time.time()
# 여기에서 Selenium을 사용하여 작업을 수행하는 코드를 작성하세요
end_time = time.time()

print(f"수행 시간: {end_time - start_time} 초")
  

이 간단한 코드 조각은 코드 일부를 실행하는 데 얼마나 시간이 걸리는지 알려줄 거야. 이렇게 "타이머"를 사용하면 "좁은 부분"을 찾아낼 수 있어.

취약한 부분을 확인하고 최적화하기

시간을 많이 잡아먹는 코드 부분을 찾았으면, 조치를 취해 보자. 예를 들어, 불필요하게 동적 요소에 너무 자주 접근하거나 코드가 "스파게티"처럼 되어 있을 수 있어. 첫 번째 단계는 확인이고, 두 번째 단계는 행동이야.

요청 수 줄이기: 페이지 간 이동이나 DOM 갱신을 너무 자주 하는지 확인해 봐. 예를 들어, WebDriverWait 메서드를 사용하면 원하는 요소가 완전히 로드된 후에만 스크립트를 실행할 수 있어.

Python

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'myDynamicElement'))
)
  

데이터 캐싱: 동일한 데이터를 여러 번 사용하는 경우 캐싱을 고려해 봐. 데이터를 변수나 캐시에 저장해서 자원을 많이 사용하는 작업을 최소화할 수 있어.

2. 스크립트 구조 개선

코드가 지하철 노선도처럼 읽힌다면, 이제 개선할 때가 된 거야. 최적화된 코드 구조는 가독성과 오류 내성을 높이는 핵심이야.

데이터 파이프라인 및 최적 알고리즘 솔루션 사용

코드를 각 함수나 모듈이 각자의 논리적 작업을 담당하는 파이프라인 형태로 구조화하는 걸 고민해 봐. 코드를 논리적인 블록으로 나누면 가독성이 좋아지고 디버깅도 쉬워져.

Python

def load_page(url):
    driver.get(url)

def extract_data():
    # 데이터 추출 코드
    pass

def save_data():
    # 데이터 저장 코드
    pass

load_page("http://example.com")
extract_data()
save_data()
  

코드 가독성과 테스트 용이성 개선

"하나의 함수는 하나의 작업을 한다"는 원칙을 따르자. 이렇게 하면 테스트와 리팩토링이 쉬워져. "매직 넘버"나 문자열 대신 명명된 상수를 사용해 더 명확하게 하자.

Python

MAX_RETRIES = 5

def fetch_data_with_retry():
    for attempt in range(MAX_RETRIES):
        try:
            # 데이터 요청 시도
            pass
        except Exception as e:
            print(f"시도 {attempt+1} 실패: {e}")
  

3. 개선할 수 있는 코드라면 반드시 개선하자

암시적 대기 대신 명시적 대기 사용

명시적 대기는 Selenium이 원하는 요소가 나타날 때만 작업을 수행하도록 정확한 제어를 허용해 줘. 암시적 대기 (implicitly_wait) 대신, 특정 요소를 조건에 따라 기다릴 수 있는 WebDriverWait를 사용해 봐.

명시적 대기 사용 예제

Python

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.ID, "target_element"))
)
  

페이지 준비 상태 확인

페이지가 로드된 후에도 모든 요소가 즉시 사용할 수 있는 것은 아니야, 특히 AJAX를 사용하는 경우. document.readyState를 사용해 문서가 완전히 로드되었는지 확인하고 작업을 시작하자.

페이지 로드 완료 확인 예제

Python

def wait_for_page_load(driver):
    WebDriverWait(driver, 10).until(
        lambda d: d.execute_script("return document.readyState") == "complete"
    )
  

time.sleep 사용 최소화

time.sleep()는 스크립트를 고정된 시간 동안 기다리게 해서 작업 속도를 늦춰. 대신, WebDriverWait를 사용해서 필요한 조건이 충족될 때까지 기다리도록 하자.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION