무효 클릭 IP 추적 중...
파이썬/파이썬 기초

[파이썬 기초] 셀레니움(selenium) NoSuchElementException , ElementNotVisibleException 에러 해결 방법

꼬예 2020. 5. 13.

selenium을 통해 크롤링을 하면 

'NoSuchElementException , ElementNotVisibleException ' 와 같은 에러를 자주 만나는데요.

 

 

이와 같은 에러가 발생하는 이유는 렌더링 되기전에 특정 요소를 찾으려고 했기 때문입니다.

쉽게 말해 아직 웹페이지가 준비도 안되었는데 정보를 긁으려고 하다보니 발생 되는 문제인것이지요.

 

 

이와 같은 문제를 해결하려면 어떻게 해야 할까요?

간단합니다. 웹페이지가 준비가 다 될때까지 기다려 주면 됩니다.

 

파이썬에서는 여러가지 '시간 대기 메소드'가 있는데요. 

 

그 중에서 오늘 알려드릴 메소드는 time.sleep, 명시적대기(implicit wait), 암시적대기(explicit wait) 총 3개 입니다.

 

각각의 차이점 및 사용법을 알아보겠습니다.

 

 

1. 차이점

 

[1] time.sleep VS implicit wait (암시적대기) , explicit wait(명시적대기)

 

time.sleep파이썬에서 기본 제공하는 메소드이고 암시적대기명시적대기셀레니움에 좀더 특화된 대기 방법이라고 할 수 있습니다. 

 

기능적 차이로는 10초를 딱 ! 기다리라고 명령을 했을때 time.sleep은 딱 10초를 기다리고 코드를 실행시킵니다.

 

반면 암시적대기 또는 명시적대기로 10초를 딱 기다리라고 하면 이 친구들도 10초를 기다리긴 기다리는데, 웹페이지가 3초만에 준비가 되면 남은 7초를 기다리지 않고 바로 실행한다는 장점이 있습니다. 

 

[2] implicit wait (암시적대기) vs  explicit wait(명시적대기)

 

암시적대기(implicit wait)는 웹페이지 전체가 준비될때까지 기다립니다. 반면 명시적대기(explicit wait)는 내가 정한 특정 요소가 준비 될때 까지 기다립니다.

 

웹페이지 전체가 뜰때까지 기다리는게 아니라 내가 필요한 요소가 뜨기만 하면 동작이 되기 때문에 명시적대기가 더 효율적이라고 볼 수 있습니다.

 

하지만 그만큼 원하는 요소 위치를 지정해줘야 하기때문에 코드가 조금 복잡해 진다는 단점도 있습니다.

 

 

 

 

2. 사용방법

1. time.sleep

1
2
3
4
5
6
import time
 
# 5초 대기
 
time.sleep(5)
 
cs

time을 import 하고 time.sleep(원하는 초)를 기입하면 됨으로 상당히 간단하다고 할 수 있습니다.

 

2. 암시적대기(implicit wait)

1
2
3
4
5
from selenium import webdriver
 
driver = webdriver.Firefox() # 여기서는 Firefox를 예로 들었습니다. (chrome, phantom js 여러가지로 이용 가능 합니다.)
driver.implicitly_wait(10# 10초를 기다리 겠다.
 
cs

driver을 먼저 설정 해줘야 합니다. 

webdriver.Chrome(), webdriver.PhantomJS 등 다른 여러가지 브라우저도 사용 가능합니다.

 

 

3. 명시적 대기(explicit wait)

1
2
3
4
5
6
7
8
9
10
11
12
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
 
 
# XPATH를 이용한 경우
elem = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH,'''//*[@id="__next"]/div/div[3]/div/div[2]/div[1]/div/div/''')))
 
# CSS selector 를 이용한 경우
elem = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR,'''#main > div.code''')))
 
cs

1. 앞선 대기 방법과는 다르게 많은 라이브러리들을 import 해줘야 하는 것을 볼 수 있다.

 # as EC 는 expected_conditions가 길다보니 축약형으로 사용하겠다는 의미로 업계에선 이렇게 사용한다.

 

2. WebDriverwait(driver. '기다릴 시간').until(EC.presence_of_element_located((BY.'원하는선택자',' 원하는 선택자에 기반검색 코드)))

 

<<BY.'원하는선택자'>>

BY.ID - 태그에 있는 ID 로 검색

BY.XPATH - XPATH로 검색

BY.CSS_SELECTOR - CSS Selector 로 검색

BY.NAME - 태그에 있는 name 으로 검색

BY.TAG_NAME - 태그 이름으로 검색 

 

* XPATH를 이용한 원하는 선택자에 기반검색 코드에 대해서 궁금하신 분은 아래 글을 참고 바랍니다.

 

셀레니움 XPATH 를 이용하여 원하는 정보 추출

 

이 글과 읽으면 좋은글

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글