-
[Spring] 우분투 서버에서 Docker로 Selenium 환경 구축하기Backend/Spring 2023. 6. 14. 00:39728x90
시작
Spring 프로젝트에서 Selenium을 사용해 크롤링을 구현했다. 로컬에서 잘 돌아가던 코드가 서버에서 안돌아가는 경우가 많지만 Selenium은 정말정말 에러도 많고 구축하기 어려웠다. 그 과정을 정리해보려고 한다!
⚙ 개발환경
- GCP 인스턴스 리눅스 우분투 18.04
- JDK 17
- Gradle
- Spring Boot
구조
Selenium을 사용하기 위해선 크롬과 크롬드라이버가 필요하다. 특히 이 둘의 버전을 맞춰서 설치해주어야 한다.
Command Line으로 서버에 설치하는 방법도 있겠지만 Dockerfile에 명령어를 작성해두는 것을 선택했다.
Dockerfile을 통해 크롬과 크롬드라이버를 설치하고 컨테이너에 설치된 드라이버를 selenium에서 사용할 수 있도록 할 것이다.
📌과정
- Dockerfile
- Spring Selenium 설정
Dockerfile
도커 컨테이너에 크롬 브라우저와 크롬 드라이버를 설치하고 배포한다. 특히 크롬 브라우저와 크롬 드라이버의 버전을 일치시키는 것이 중요!
FROM openjdk:17.0.1-jdk-slim RUN apt-get -y update RUN apt -y install wget RUN apt -y install unzip RUN apt -y install curl # google chrome 설치 RUN wget https://chrome-versions.com/google-chrome-stable-114.0.5735.106-1.deb #RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb RUN apt-get -y update RUN apt -y install ./google-chrome-stable-114.0.5735.106-1.deb #RUN apt -y install ./google-chrome-stable_current_amd64.deb # chromedriver 설치 RUN wget -O /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/` curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE_114`/chromedriver_linux64.zip RUN unzip /tmp/chromedriver.zip chromedriver -d . ADD PLANU/build/libs/test-0.0.1-SNAPSHOT.jar test.jar ENTRYPOINT ["java","-jar","-Dspring.profiles.active=local", "/test.jar"]
- 현재 제일 최신 버전은 114로 해당 버전으로 지정해서 다운로드 받았다.
- 초기에는 주석처럼 stable 크롬 브라우저와 latest 크롬 드라이버를 다운받았었는데,
- 이 방식은 두 개의 버전이 일치하는지 확인하기도 어렵고, 에러도 계속 발생해서 버전을 따로 지정해주었다.
- 크롬브라우저와 크롬 드라이버 버전은 원하는 버전으로 변경해도 된다.
- 크롬 드라이버의 경우 chromedriver라는 이름으로 압축을 해제하는데 이때 경로를 잘 줘야한다.
- 자신이 원하는 경로에 chromedriver의 압축을 풀어준다.
- 나의 경우 따로 폴더에 저장하지 않고 그냥 root 경로에 두었다. (스프링에서 설정하기 편할것 같아서,,,ㅎ)
- profiles는 자신의 설정에 맞게 잘 적어주기
- 잘못적어서 스프링에서 환경변수를 못찾아 한참 헤맸던 기억이 있다.
크롬 브라우저 다운로드 링크
Index of /
chrome-versions.com
크롬 드라이버 다운로드 링크
ChromeDriver - WebDriver for Chrome - Downloads
Current Releases If you are using Chrome version 115 or newer, please consult the Chrome for Testing availability dashboard. This page provides convenient JSON endpoints for specific ChromeDriver version downloading. For older version of Chrome, please see
chromedriver.chromium.org
- 크롬드라이버 버전 설정 관련 내용은 여기서↓
ChromeDriver - WebDriver for Chrome - Version Selection
We maintain multiple versions of ChromeDriver. Which version to select depends on the version of Chrome you are using it with. Specifically: ChromeDriver uses the same version number scheme as Chrome. See https://www.chromium.org/developers/version-numbers
chromedriver.chromium.org
Spring Selenium 설정
Spring에서 ChromeDriver를 사용하기 위해선 웹 드라이버 ID와 웹 드라이버 경로를 지정해주어야한다.
- 웹 드라이버 ID : webdriver.chrome.driver
- 웹 드라이버 경로: chromedriver(==Dockerfile에서 압축을 풀어준 경로!)
@Service public class CrawlerService { //WebDriver private WebDriver driver; //Chrome Options; private ChromeOptions options; //Properties private final String WEB_DRIVER_ID = "webdriver.chrome.driver"; private String WEB_DRIVER_PATH = "chromedriver"; //크롤링 할 URL private String base_url; public CrawlerService() { //System Property SetUp System.setProperty(WEB_DRIVER_ID, WEB_DRIVER_PATH); options = new ChromeOptions(); options.addArguments("--disable-popup-blocking"); options.addArguments("--disable-default-apps"); options.addArguments("--disable-notifications"); options.addArguments("--disable-blink-features=AutomationControlled"); options.addArguments("--remote-allow-origins=*"); options.addArguments("--single-process"); options.addArguments("--headless"); options.addArguments("--no-sandbox"); options.addArguments("--disable-dev-shm-usage"); options.addArguments("--ignore-ssl-errors=yes"); options.addArguments("--ignore-certificate-errors"); options.addArguments("--remote-debugging-port=9222"); base_url = "https://naver.com"; driver = new ChromeDriver(options); driver.get(base_url); }
ChromeOption
옵션을 지정하지 않으면 상당히 다양한 에러를 만나게 되는데 옵션을 지정해서 해결할 수 있다.
위에 많은 옵션들을 적었는데 로컬에서 필요한 옵션과 서버에서 추가적으로 필요한 옵션들로 양이 많아졌다.
1. Checking your browser before accessing URL 에러 해결
- 크롤링을 진행할 때 다음과 같이 나오면서 페이지를 가져오지도 않고 크롤링도 진행되지 않는 경우가 있다.
- 사이트 접속 전 나의 브라우저를 확인하는 것으로 서버를 보호하기 위한 목적으로 나타나는 메시지이다.
- 다음의 argument를 작성하여 해결할 수 있다.
ChromeOptions options = new ChromeOptions(); options.addArguments("--disable-popup-blocking"); options.addArguments("--disable-default-apps"); options.addArguments("--disable-notifications"); options.addArguments("--disable-blink-features=AutomationControlled");
2. DevToolsActivePort file doesn’t exist 에러 해결
ChromeDriver 객체 생성 시 다음과 같은 에러가 나는 경우가 있다. 해당 에러에 대해 사람마다 적용한 argument가 달라서 하나씩 시도해서 되는 방법을 찾았다.
selenium.common.exceptions.WebDriverException: Message: unknown error: DevToolsActivePort file doesn't exist
1) --single-process argument
ChromeOptions options = new ChromeOptions(); options.addArguments("--single-process");
2) --disable-dev-shm-usage argument
ChromeOptions options = new ChromeOptions(); options.addArguments("--disable-dev-shm-usage"); options.addArguments("--ignore-ssl-errors=yes"); options.addArguments("--ignore-certificate-errors");
3) --remote-debugging-port argument
ChromeOptions options = new ChromeOptions(); options.addArguments("--headless"); options.addArguments("--no-sandbox"); options.addArguments("--disable-dev-shm-usage"); options.addArguments("--remote-debugging-port=9222");
나의 경우 1, 2, 3번의 argument를 모두 사용했다...
하지만 해당 argument들은 배포 서버에서만 필요한 것으로 로컬에서는 없이도 잘 작동된다!
끝
이렇게 하면 배포 서버에서 셀레니움 환경 구축 완료!
참고
https://9keyyyy.tistory.com/47
https://bsssss.tistory.com/937
https://berrrrr.github.io/programming/2019/08/17/devtoolsactiveport/
https://gmyankee.tistory.com/240
728x90'Backend > Spring' 카테고리의 다른 글