크롤링하다가 오류가 나는 경우, 처음부터 다시 해야 해서 중간에 이를 저장하고 넘어가는 코드를 서치해보았다. 별도의 코드를 사용하기보다는 중간단계를 잘 나누어 저장해두는 방식으로 해결을 봐야 하는 듯 하다.
Message: no such element: Unable to locate element:
{"method":"xpath","selector":"/html/body/div[1]/div/div/div/div/div/div[2]/div[4]/div/div[12]/article/a"}
오류 설명
: element를 찾을 수 없다.
해결책
: 이 에러가 나는 부분이 매번 다른 것을 보니 로딩 시간의 문제인듯 해서 time.sleep을 지정하는 변수에서 randint의 범위를 좀 더 늘려줬다.
직접 초를 기입하지 않고 randint로 쓰는 이유는 대기 시간이 매번 같으면 크롤링으로 인식해서 막는 경우가 있기 때문에 랜덤하게 수를 뽑아 매 아이템마다 다른 대기 시간이 걸리도로 했다.
from random import randint
#timesleep
x = randint(2,5)
y = randint(2,5)
ElementClickInterceptedException: Message: element click intercepted: Element is not clickable at point (688, 102). Other element would receive the click:
오류 설명
: element가 clickable하지 않아 다른 element가 이 click을 받았을 수 있다.
해결책
: 서치를 해보니 element가 clickable 할 때까지 기다려주는 기능(EC)이 있다. 나는 wait과 함께 EC 중에서도 아래의 옵션(element_to_be_clickable)을 사용했다.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.XPATH, prod_xpath)))
1. ActionChains(driver)
# 스크롤을 위한 밑단 작업
prod_xpath = 'PATH'
prod_info = driver.find_element(By.XPATH, prod_xpath)
# 스크롤
actions = ActionChains(driver)
actions.move_to_element(prod_info).perform()
time.sleep(x)
2. PAGE DOWN
: 버전이 바뀌어서 ''WebDriver' object has no attribute 'find_element_by_tag_name''라는 오류가 떠서 두번째와 같이 수정하였다.
from selenium.webdriver.common.keys import Keys
body = driver.find_element_by_tag_name('body')
body.send_keys(Keys.PAGE_DOWN)
from selenium.webdriver.common.keys import Keys
body = driver.find_element(By.TAG_NAME,'body')
body.send_keys(Keys.PAGE_DOWN)
iframe_element = driver.find_element(By.ID, "iframe_id")
-원하는 영역에 우클릭하고 검색 - 바로 컨트롤c
-우클릭 후 들어가서 다양한 패스로 위치를 딸 수 있음.