반응형
셀레니움, 크롤링 안전한 예외처리 예제
글. 수알치 오상문
다음 코드는 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 건
반응형
'웹 크롤링, 스크래핑' 카테고리의 다른 글
파이썬, Scarpy 스크래피 설치 ERROR: Could not find a version that satisfies the requirement scarpy (from versions: none) (0) | 2022.08.01 |
---|---|
파이썬, 셀레니움 옵션 최적화 스크롤링 예제 (0) | 2022.08.01 |
셀레니움, NameError: name 'StaleElementReferenceException' is not defined (0) | 2022.08.01 |
파이썬 셀레니움, 열린 경고창 닫기 (0) | 2022.07.31 |
파이썬 셀레니움, 같은 웹브라우저에서 다른 탭으로 url 열기 (0) | 2022.07.30 |