Web Scraping을 urllib이나 Requests를 사용할 경우 상대적으로 빠른 이점이 있으나 동적으로 로딩되는 템플릿 데이터를 정상적으로 취득하지 못하는 경우가 발생한다. 이 때, 가상 브라우저를 사용하면 문제를 해결 할 수 있으며 (반면에 메모리 사용량 증가 및 속도가 느려지는 단점이 있다.) 대표적인 가상 브라우저 도구인 Selenium을 적용해 보도록 하자.
Selenium을 사용해서 Headless Browser로 웹 화면을 읽어오기 위해서는 외부 Web Driver를 연동해야 하는데 내장되어 있지 않으므로 별도로 설치를 해주어야 한다. 대표적인 Web Driver는 다음과 같다.
여기서 일일이 열거하지는 않겠지만 서버를 새로 구축 하는 것 빼고는 다 해본 것 같다. Chrome Driver는 드라이버만 설치하면 되기 때문에 간단해서 좋았는데 이렇게 되어 버렸으니 Firefox + Gecko Driver로 교체해 보기로 하였다. 결론부터 말하면 교체 후에 문제가 해결 되었다.
Firefox + Gecko Driver를 사용하면 몇 가지 작업을 더 해주어야 하는데 모두 정리하면 다음과 같다. (Firefox를 이용한 여러가지 케이스를 시도해본 결과 이 방법이 문제없이 완벽하게 동작했다.)
DISPLAY 번호(:1)가 Xvfb 설정(:10)과 다를 경우 다음과 같은 오류가 발생한다.
1
2
$ firefox
Error: cannot open display: :1
정리하면 다음과 같다.
Firefox 실행 → 10번 화면 오픈 → 10번 화면 Frame Buffer (Xvfb)
Selenium 설치
Python 패키지 매니저인 pip)을 이용해서 Selenium과 Web Scraping 시에 Parser로 아주 유명한 BeautifulSoup도 같이 설치한다.
1
$ pip install selenium beautifulsoup4
본인의 경우 pyenv와 virtualenv를 사용해서 Python 기본 개발 환경을 구축했는데 장점은 다음과 같다.
사용하는 시스템에 따라 패키지의 의존성 문제나 충돌 문제가 사라짐.
다양한 버전의 패키지를 간단히 설치 및 삭제할 수 있다.
한 버전에 대해서 또 다른 가상 버전을 간단히 추가 및 삭제 할 수 있다.
특정 작업 디렉토리에 특정 버전 또는 가상 버전의 패키지를 연결 할 수 있다. (예: A 디렉토리는 Python 3.5, B 디렉토리는 anaconda 5.0.0)
시간이 된다면 정신 건강을 위해서라도 꼭 사용하길 권장한다.
Selenium 동작 확인
이제 Selenium을 사용할 준비가 되었으니 동작을 확인할 테스트 코드를 작성하자. 위 과정을 진행하면서 문제가 없었다면 Python 코드 내에서 Firefox binary나 geckodriver 파일 위치를 수동으로 지정하지 않아도 된다. (수동으로 지정이 필요할 경우 여기를 참고하자.)