1. webdriver_manager
크롬 vs. 크롬 드라이버 버전 맞춰서 돌리더라도 아래처럼 DeprecationWarning 경고가 뜬다면!!
"DeprecationWarning: executable_path has been deprecated, please pass in a Service object"
이는 셀리니움이 4 버전대로 업데이트되면서,
"왜 더 이상 사용하지 않는 방법으로 실행 경로를 지정하는 건데? Service 객체를 사용하라고, 이 자식!"이라 욕하는 것이다..
pip install webdriver_manager로 모듈을 다운로드하고, 기존에 쓰시던 코드를 조금 수정해주면~~
크롬이 업그레이드될 때마다 맞는 버전의 크롬 드라이버 또한 자동으로 업그레이드되기 때문에,
드라이버를 찾아서.. 다운로드하고.. 경로 지정..(헉헉)을 해줄 필요가 없다!! 🤓
2. StaleElementReferenceException
인스타그램 크롤링을 할 때 버튼 엘리먼트를 XPATH 혹은 Class Name으로 찾았었는데,
로그에 오류가 뜨는 걸 보니 해당 경로의 아주 일부가 조금 바뀌어서 찾지 못한다.. 가만히 있으라고, 인별!! >:(
그래서 아주 직관적으로 Tag Name의 인덱스로 찾는 것으로 코드를 바꿨는데,
지정해서 찾는 것보다 시간이 오래 걸리는지 타임 아웃이 되면서 아래 에러 메시지와 함께 크롬 창이 꺼져 버린다!!
"selenium.common.exceptions.StaleElementReferenceException"
검색.. 검색.. 검색해보니
DOM에 해당 Element가 존재하지 않거나, 페이지가 완전히 로딩되기 전에 참조하거나, 다른 Webdriver의 Element를 참조할 때 발생하는 에러라고 한다. 따라서 상당 경우 해당 소스가 뜰 때까지 충분한 시간을 주면 문제는 해결할 수 있다는데~
기존에는 time.sleep으로 페이지마다 3초씩 일시정지를 주었는데, 이참에 얼핏 보았던 WebDriverWait를 사용해보려 한다.
# 1안
time.sleep(sec)
# 2안
driver.implicitly+wait(sec)
# 3안
WebDriverWait(driver, sec).untill(EC.presence_of_located((by.ID, ID)))
해보자고!!
해봤더니,
기존에 time.sleep으로 짰던 코드는,
CPU times: user 573 ms, sys: 89.6 ms, total: 662 ms
Wall time: 1min 2s
새로 짠 코드는,
CPU times: user 344 ms, sys: 0 ns, total: 344 ms
Wall time: 32.8 s
압도적으로 빠르다!!!!!
'개인 공부' 카테고리의 다른 글
9/20 화_우분투 VS Code 한글 입력 안됨, Qt platform plugin 경로 에러 (0) | 2022.09.20 |
---|---|
9/18 일_EC2 Timezone, EC2 Scheduler(Lambda, EventBridge) (0) | 2022.09.19 |
9/11 일_Amazon ECR(Docker Image push/pull) (0) | 2022.09.12 |
9/10 토_Docker (2) | 2022.09.11 |
9/6 화_DBeaver (0) | 2022.09.07 |