-
[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는 자신의 설정에 맞게 잘 적어주기
- 잘못적어서 스프링에서 환경변수를 못찾아 한참 헤맸던 기억이 있다.
크롬 브라우저 다운로드 링크
크롬 드라이버 다운로드 링크
- 크롬드라이버 버전 설정 관련 내용은 여기서↓
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' 카테고리의 다른 글