셀레니움 에러
크롤링을 하면서 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이 1개인 것을 찾아보는 방법도 있고
그냥 다른 방법으로 css_selector나 xpath로 변경해서 가져오는 방법도 있다.
꼭 class_name을 사용할때는 그 class_name이 몇개인지 확인해야 한다.
(해당 웹페이지 html에서 ctrl + f로 검색)
이 정도가 현재 생각나는 no such에러에 대한 해결방법이다.
도움이 됐다면 아래 공감(♥)을 눌러주고 다른 방법과 더 좋은 방법이 있으면 댓글
'Python > DataCrawling' 카테고리의 다른 글
[selenium실습] 구글맵에서 미국 음식점 이름 크롤링 3 (3) | 2022.05.13 |
---|---|
[selenium실습] 구글맵에서 미국 음식점 이름 크롤링 2 (2) | 2022.05.13 |
[selenium실습] 구글맵에서 미국 음식점 이름 크롤링 1 (0) | 2022.05.12 |
[selenium]셀레니움 크롤링 데이터 가져오는 방법 정리 (0) | 2022.04.30 |
[selenium]셀레니움 크롤링 옵션 및 기능 - python (0) | 2022.04.30 |