웹은 크게 2가지로 나눌 수 있다.

웹의 종류

selenium은 가장 유명한 브라우저 자동화도구이다. 실제 웹브라우저를 켜는 과정을 거치기 때문에 selenium을 이용하면 동적 페이지에서도 데이터를 수집할 수 있다

브라우저를 직접 동작시킨다는 것은 JavaScript를 이용해 비동기적으로 혹은 뒤늦게 불러와지는 컨텐츠들을 가져올 수 있다는 것이다.

즉, ‘눈에 보이는’ 컨텐츠라면 모두 가져올 수 있다는 뜻이다.

requests에서 사용했던 .text의 경우 브라우저에서 ‘소스보기’를 한 것과 같이 동작하여, JS등을 통해 동적으로 DOM이 변화한 이후의 HTML을 보여주지 않는다.

반면 Selenium은 실제 웹 브라우저가 동작하기 때문에 JS로 렌더링이 완료된 후의 DOM결과물에 접근이 가능하다.

Selenium에서 흔히 겪는 문제 - NoSuchElementException

셀레니움을 사용하면 항상 마주하는 오류가 NoSuchElementException 이다.

AJAX를 사용해 동적으로 변화하는 html페이지의 경우 web element가 DOM로 나타나기까진 시간이 걸릴때가 있다

변화된 페이지 로딩이 되기 전에, 코드가 실행되어 요소를 찾지 못하는 것이다. 이를 해결하는 방법은 여러가지가 있다.

1. time 모듈

가장 쉬운 방법이다. time 모듈을 불러와 time.sleep(int)을 사용한다. int (초)만큼 코드 실행을 잠시 멈추며, 모든 시간을 소비하고 나서야 다음 코드를 실행한다.

하지만 이 방법은 비효율적이다. 네트워크에 따라서 페이지 로딩이 빠를수도, 느릴수도 있다.

명시한 시간을 소비하기 전에 페이지가 로딩이 된다면, 나머지 시간을 낭비하게 된다.

반대로 시간을 모두 소비하고도 페이지 로딩이 완벽히 되지 않은 경우가 있어 오류가 발생할 수 있다.

그래서 time 모듈을 사용하는 것은 권장되지 않는 방법이다.

2. Implicitly_wait 함수

두 번째 방법은 셀레니움 내장 함수인 **driver.implicitly_wait(int)를 사용**하는 것이다.