[selenium] 크롤링 no such element 오류 해결
Python/DataCrawling

[selenium] 크롤링 no such element 오류 해결

728x90

셀레니움 에러

크롤링을 하면서 element에 접근하는 코드 실행시 가장 많이 만나는 에러는 no such element일 것이다.

내가 지정한 element(css_selector = rogA2c)의 값을 못찾을 경우 발행하는 에러이다.

내가 크롤링하면서 이 오류를 해결했던 방법을 공유한다.

 

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".rogA2c"}
  (Session info: chrome=101.0.4951.64)

1. class_name으로 접근시 공백 오류

class_name으로 element에 접근할때 유의해야하는 점이 있다.

그건 공백처리인데 아래 예시처럼 class_name에 공백이 있을경우 공백을 마침표(.)로 대체 해줘야한다.

ex m6Erb tLjsw -> m6Erb.tLjsw

이 방법은 구글링으로 잘 안나와서 이것저것 실험해보면서 찾은 방법이다.

 

2. 로딩시간으로 인한 오류

셀레니움 코드로 웹페이지를 켜고 바로 driver.find_element_by_id 등의 element에 접근하는 코드를 사용하면 no such 에러가 발생한다. 

그래서 아래 코드처럼 time.sleep(시간) 코드로 잠시 기다렸다가 데이터를 가져오면 에러가 해결된다.

이 문제로 no such element 에러가 가장 많이 발생한다. 코드 중간중간 time.sleep을 넣는걸 추천한다.

(*주의 너무 많이 넣으면 크롤링 시간이 어마어마하게 걸림)

만약 얼마나 걸릴지 잘 모르겠다면 WebDriverWait 메서드를 사용하는 방법도 있음

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

try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "tactile-searchbox-input"))
    ) #입력창이 뜰 때까지 대기
finally:
    pass

10초안에 class_name "tactile-searchbox-input" 의 존재가 감지되면 다음 코드로 넘어감 

 

3. 여러개의 동일한 class_name 오류

class_name으로 element에 접근할 때 주의 해야할 점은 그 class_name이 1개가 아닐때이다.

(class_name외에는 한개만 존재)

위 사진처럼 class_name이 여러개일 경우에는 find_elements_by_class_name를 사용해서 리스트형태로 받은 다음에 저 순서에 맞게 데이터를 가져오는 방법이 있다. 

여러개의 class_name중 4번째 text를 가져오고 싶을때

아니면 가져올 데이터를 포함하는 부모 태그로 올라가서 class_name이 1개인 것을 찾아보는 방법도 있고 

그냥 다른 방법으로 css_selector나 xpath로 변경해서 가져오는 방법도 있다.

꼭 class_name을 사용할때는 그 class_name이 몇개인지 확인해야 한다.

(해당 웹페이지 html에서 ctrl + f로 검색)

 

이 정도가 현재 생각나는 no such에러에 대한 해결방법이다.

도움이 됐다면 아래 공감(♥)을 눌러주고 다른 방법과 더 좋은 방법이 있으면 댓글

728x90