반응형

셀레니움, 크롤링 안전한 예외처리 예제 

 

글. 수알치 오상문

 

다음 코드는 DAUM 사이트에 로그인, 편지함 이동, 안읽은 메일 건수 확인, 로그아웃 하는 예제이다.

 

# 다음 사이트 접속 예제 : 안전한 예외 처리 
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import StaleElementReferenceException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import time
myid = "다음아이디"
pw = "비밀번호"
class DaumProductAutomation():
    def __init__(self):
        self.driver = None        
    def setupSelenium(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()  # 웹브라우저 화면 최대 크기
        self.driver.implicitly_wait(10)  # 페이지 로딩 허용 시간
    def loginToDaum(self):
        # 다음 홈페이지 접속
        self.driver.get('https://daum.net')
        # 로그인 링크 클릭 
        el = WebDriverWait(self.driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#inner_login > a.link_daumid')))
        el.click()
        WebDriverWait(self.driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#id')))
##        # id 및 pw 입력 처리 (1)        
##        self.driver.find_element(By.ID, 'id').send_keys(myid)        
##        time.sleep(0.2)
##        self.driver.find_element(By.ID, 'inputPwd').send_keys(pw+'!')
##        el = self.driver.find_element(By.ID, 'loginBtn').click()
##        time.sleep(2)
        # id 및 pw 입력 처리 (2) try...except     
        el = self.driver.find_element(By.ID, 'id')
        el.click()
        # self.driver.refresh()        
        try:
            el.send_keys(myid)
        except StaleElementReferenceException as e:
            try:
                el = self.driver.find_element(By.ID, 'id')
                el.send_keys(myid)
            except Exception as e:
                raise
        except Exception as e:
            raise  # 호출 함수에 에러 넘겨주기
        time.sleep(0.2) 
        try:
            self.driver.find_element(By.ID, 'inputPwd').send_keys(pw)            
            el = self.driver.find_element(By.ID, 'loginBtn').click()
        except Exception as e:
            raise
        time.sleep(3)
        # 계정 통합 안내 페이지면...
        if 'https://accounts.daum.net/integration' in self.driver.current_url:
            try:
                el = WebDriverWait(self.driver, 10).until(
                    EC.presence_of_element_located((By.CSS_SELECTOR, '#mArticle > div > div.wrap_btn > a')))
                el.click()
            except Exception:
                raise   
        # 열린 경고창들 닫기
        try:
            WebDriverWait(self.driver, 5).until(EC.alert_is_present())
            for i in range(10):
                self.driver.switch_to.alert.accept()
        except Exception:
            pass            
        # 메일함 페이지로 이동
        try:
            el = self.driver.find_element(By.CSS_SELECTOR,
                 '#daumHead > div.d_service > div > div.menu_service > ul > li:nth-child(2)')
            el.click()
        except Exception:
            raise
        # 안읽은 편지 개수 출력
        try:
            el = WebDriverWait(self.driver, 5).until(
                EC.presence_of_element_located((By.CSS_SELECTOR,
                    '#folder > div > div.scroll > div:nth-child(1) > ul > li:nth-child(1) > a:nth-child(3)')))
            cnt = el.get_attribute('innerText')
        except Exception as e:
            raise
        else:
            cnt = cnt.replace("안읽음", "").strip()
            print(f"안읽은 편지: {cnt} 건")
    def ecxcuteTask(self):
        self.setupSelenium()  
        try:
            self.loginToDaum()
        except NoSuchElementException as e:
            print("NoSuchElement Error:", e)
        except StaleElementReferenceException as e:
            print("StaleElementReference Error:", e)        
        except Exception as e:
            print("Error:", e)    
        else:
            input("QUIT?:")
            # 홈페이지로 이동
            self.driver.get('https://daum.net')
            # 로그아웃 링크 클릭 
            el = WebDriverWait(self.driver, 10).until(
                EC.presence_of_element_located((By.CSS_SELECTOR,
                    '#mArticle > div.feature_tmp > div.login_tmp.login_my > div.wrap_my > span.rel_my > a')))
            el.click()
        finally:
            time.sleep(0.5)
            self.cleanUpBrowser()    
    def cleanUpBrowser(self):
        self.driver.quit()  # 웹 드라이버 종료  
# TEST ---------------
if __name__ == "__main__":
    daum = DaumProductAutomation()
    daum.ecxcuteTask()

 

 

[실행 결과]

안읽은 편지: 5 건

 

 

반응형

+ Recent posts