파이썬의 seleinum을 이용해 chromedriver를 사용하는 경우는 많습니다. 대표적인 웹컨트롤 모듈이며, 동적인 웹사이트에서 그 진가를 발휘합니다.
대표적인 예로는 웹스크래핑, 웹매크로등을 이야기 할 수 있겠네요. requests가 정적인 크롤링 방식이라면 selenium의 chromedriver는 역동적인 상황에서 웹을 제어하고, 그 결괏값을 가져올 수 있습니다.
가장 대표적이 상황은 ‘무한 스크롤’이라 할 수있습니다. 또한, 로그인이 필요한 경우 정해진 형식에 맞춰 로그인을 진행해 원하는 반복작업을 진행할 수 있습니다.
파이썬에 대한 기본적인 이해도만 있다면 누구나 손쉽게 접근할 수 있으며, 원하는 작업을 원활하게 자동화로 구현할 수 있습니다.
개인적으로 웹서버를 이용하고 있습니다. 아주 잠깐이지만, 서버를 이용하기 위한 로그인이 귀찮게 여겨지곤 했네요. 한번의 클릭으로 서버에 접근할 수 있다면 좋겠다는 생각을 했습니다.
그래서 또, 두드려봐야죠. qtdesigner와 selenium webdriver를 이용한 자동로그인, 그리고 원하는 작업을 진행하는 것이었습니다.
크게 어렵지 않은 작업이기 때문에 빠르게 코드를 진행할 수 있습니다. 물론, 구글링은 언제나 함께하는 동반자와 같습니다. 마음이 급해도 하나씩 퍼즐을 맞추면 결과를 얻을 수 있습니다.
◼ 원하는 기능
- 내가 가지고 있는 서버(WHM & cPanel)에 자동으로 로그인을 합니다.
- 그 후, 원하는 페이지로 이동합니다.
너무 간단해 별도의 코드를 설명하지 않아도 좋을 것 같습니다. 조금의 경험이 있다면 위 내용을 보자마자 견적이 나올테니까 말이죠.
저번에 만들었던 이미지 압축 프로그램에 해당 서버에 자동으로 로그인 할 수 있는 기능을 추가했습니다. 스크립트에서는 만족되는 결과를 얻을 수 었었지만, 또, 알 수 없는 오류가 발생합니다.
👉 파이썬, 이미지 압축프로그램 만들기 도전.(feat.tinify)
쉽게 생각했다가 뒤통수를 계속 맞는 기분입니다. 이제부터 해결방법을 찾는 여정을 시작합니다. 아마, 수도 없이 포기라는 타협을 했던 것도 같네요.
◼ 만나게 된 상황.
- pyinstaller를 이용해 exe를 만들때, 용량이 너무 큰 문제
- 여기서 그냥 넘어갔다면 다음 문제는 만나지 않았을 거라 생각합니다. 그래서 포기하려 했습니다.
- 다른 환경에서 pyinstaller로 만들 경우, selenium webdriver, chromedriver의 오류 시작.
- 작업을 시작했을 때, chromedriver의 꺼짐.
- 기존 작업 환경에서는 문제가 없었지만, 다른 환경에서는 스크립트에서도 chromedriver의 자동 꺼짐이 발생.
- 코드를 단순화 해서 확인 했을 때도 꺼짐.
- 최대한 깨끗한 환경의 os 준비 후, 스크립트 진행해도 꺼짐.
◼ 결국, 타협없이 해결!!!
- 결국, selenium의 다운그레이드, 3.141.0버전으로 설치 후 해당 문제 해결
모든 이야기를 담기에는 길이 너무 장활할 것 같습니다. 위에서 언급한 상황을 이해하고 해결하는데 찾아본 정보가 많기 때문입니다.
사실, 앞에서도 언급했지만 pyinstaller의 결과인 exe파일의 용량에서 타협했다면 해당 문제점들에 대해서 신경쓰지 않아도 괜찮았습니다. 다만, 지속적으로 기능을 추가할 예정이기에 해결을 위해 도전했습니다.
여러가지 생각을 했습니다. 추측이라고 해야 맞는 표현이 될 것 같네요.
- pyqt5와 selenium의 충돌에 대한 예측.
- 지정된 코드의 오류 점검.
- 컴퓨터에 조성된 환경에 대한 예측.
- selenium에 대한 추측.
- 새롭게 조성된 환경에서 selenium의 버전이 주 작업환경에서와 차이를 보이고 있음.
- selenium 과거 버전 설치를 시도.
- pip install을 이용한 selenium 3.141.0버전 설치 시도 > 실패 (더이상 지원하지 않는다고 함.)
- pypi에서 tar.gz파일을 다운받아 selenium 3.141.0 버전, 수동으로 설치.
- 그 후, 문제 해결.
이렇게 정리를 하고 보니, 크게 복자할 것은 없어 보이네요. 우선은 pyinstaller exe파일 용량문제에 대해 간략하게 살펴보겠습니다.
✔ pyinstaller 원파일 exe 용량 문제.
pyinstaller는 파이썬 스크립트를 윈도우 exe 실행파일로 만들어주는 대표적인 모듈입니다. 많은 사람들이 개인적인 용도 및 배포를 위해 pyinstaller를 활용하고 있습니다. 그 밖에도 py2win을 비롯한 다양한 라이브러리가 존재합니다.
pyintaller에는 다양한 옵션이 제공되고 있습니다. 옵션없이 실행하면, 실행파일을 비롯해 필요한 라이브러리에 관련된 폴더와 파일들이 생성됩니다. 불편하죠.
하나의 exe파일로 실행이 된다면 배포시에도 도움이 될 수 있습니다. 하나의 파일로 exe를 만든다는 것은 필요로하는 모듈을 모두 하나의 파일에 넣는 것을 의미합니다.
다만, 여기서 쓸데없는 모듈이 포함될 경우 exe파일의 용량은 상당히 클 수 밖에 없습니다. 예를 들어, selenium과 pyqt5만 필요한 경우에도 100mb를 넘어서는 용량을 보일 수도 있습니다.
해당 문제점은 anaconda base환경에서 주로 발생된다고 합니다. anaconda의 경우 다양한 모듈이 미리 설치되어 있기에 사용자에게 편리함을 줄 수 있습니다. 하지만, pyintaller에서는 용량문제로 이어질 수 있습니다.
해결책으로 다른 컴퓨터 환경에서 pyinstaller를 이용하거나, python만 있는 환경을 조성해 pyintaller를 진행하는 것입니다.
저의 경우, 기존파일이 300mb를 넘었습니다. 새롭게 python환경을 조성해 만들어진 exe파일은 40mb였습니다. 당연히 새롭게 환경을 조성해 pyinstaller를 진행해야겠죠. 여기서 부터 문제를 직면하게 됩니다.
◼ selenium 3.141.0버전 수동 설치 방법.
결국 selenium버전을 다운그레이드함으로써 문제를 해결할 수 있었습니다. 여기서 vs_code, 파이참, 파이썬 idle, 윈도우 파워쉘등 다양한 방법으로 시도해봤습니다.
물론, selenium의 문제였기에 의미없는 행동이었습니다. 다만, 문제에 직면하게 되면 추측되는 모든 방법을 사용하게 됩니다. 그야, 해당 문제에 대한 경험이 없으니까요.
1️⃣ PyPI selenium에서 3.141.0버전의 tar.gz 파일 다운로드.
pip install을 이용한 selenium 3.141.0버전은 지원하지 않습니다. 이제는 selenium 4.2(현시점 기준)을 이용하게 됩니다. 3과 4에서는 큰 차이를 보이기에 기능면에서는 4가 매력적입니다.
pypi selenium에 접속합니다. 기본적으로 4.2버전을 보여주고 있습니다. 우리는 Release history를 이용해 과거버전을 확인합니다.
스크롤을 내리다보면 3.141.0을 확인할 수 있습니다. 2018년에 등장했군요. 이곳에서 Download files를 선택합니다. tar.gz 파일을 다운받도록 합니다.
2️⃣ selenium 3.141.0 tar.gz 설치 방법.
윈도우에서 수동 설치를 위해 해당파일의 압축을 풀어야 합니다. 다행이 윈도우10에서는 자체적으로 tar.gz파일 압축 풀기를 지원합니다. cmd를 이용하거나, powershell을 이용할 수 있습니다.
개인적으로 powershell을 좋아합니다. 경로지정을 안해도 되니까요.
- 해당 폴더에서 ‘shift + 마우스 우클릭’을 하면, powershell 메뉴를 볼 수 있습니다.
tar.gz파일 윈도우에서 압축해제 및 압축하기 방법입니다.
- 압축해제 : tar -zxvf 압축파일명 -C 해제폴더명
- 압축하기 : tar -cvzf 생성파일명 압축폴더명
- 그외에도 프로그램을 이용하는 방법이 있습니다.
selenium 3.141.0 버전 python 수동 설치 방법입니다.
- 압축을 해제한 폴더로 이동(cmd) 또는 해당 폴더에서 파워쉘 열기
- python setup.py install
- 위 명령어를 이용해 tar.gz파일 수동으로 설치
➕ 윈도우의 경우, whl파일을 이용하면 과정이 더 간편합니다. 급해서 tar.gz로 진행했네요. 지나고나면 항상 못보던게 보이는 것 같습니다.
개인 프로젝트 도전을 통해 멋진 결과를 보이고 싶은데, 코드 작성보다는 오류투성이를 해결하는 기록이 되어가는 것 같네요.
언제나 코딩에 앞서 오류에 대해 생각을 하곤 합니다. ‘이렇게 하면 이렇게 작동하고, 이런 오류를 조심해야지’라고 말이죠.
하지만, 예측가능한 것은 오류라 할 수 없겠죠. 생각지 못한 문제는 언제나 발생할 수 있기에 해당 문제점을 통해 또 하나씩 배워갈 수 있는 것 같습니다.