배포 서버의 도커 컨테이너에 크롤링 환경 구축하기
⚙️ 개발 환경
- AWS ubuntu EC2
- Java 11
- Gradle
- Spring boot
문제가 발생했다. 자꾸 크롬드라이버의 경로를 못찾음 ... 뭐지뭐지 ...
📍 Dockerfile : 도커 컨테이너에 크롬 브라우저 및 크롬 드라이버 설치 후 배포
FROM openjdk:11
COPY ./build/libs/TeamPlanner-BE-0.0.1-SNAPSHOT.jar application.jar
RUN apt-get -y update
RUN apt -y install wget
RUN apt -y install unzip
RUN apt -y install curl
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN apt -y install ./google-chrome-stable_current_amd64.deb
RUN #wget -O /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/` curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN wget -O /tmp/chromedriver.zip https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/117.0.5938.92/linux64/chromedriver-linux64.zip
RUN unzip /tmp/chromedriver.zip -d /usr/bin
ENV TZ=Asia/Seoul
EXPOSE 8080
ENTRYPOINT ["java","-jar","/application.jar"]
다음그림처럼 크롬브라우저를 설치하고 , 크롬브라우저맞는 크롬드라이버 설치가 되야 했는데 latest 가 자꾸 114버전이 떠서 실패해서
그냥 수동으로 117버전을 맞춰줬다. 그랬더니 일단은 크롬브라우저와 크롬드라이버의 호환은 잘 맞았음.
그래도 경로가 잘 안잡히시는분들은
서버에 있는 파일을 컨테이너에 복사하기 위해서 아래의 명령어를 사용했다.
docker cp /usr/bin/chromedriver [컨테이너 이름]:/usr/bin/chromedriver
다음 명령어를 통해서 ec2에 크롬드라이버를 설치하고 도커컨테이너안에 해당하는 경로안에 chromedriver를 수동으로 넣는방법도 있다.
하지만 나는 제대로 설정되었음 ㅎㅎ..
📍 ChromeDriver 페이지 로딩되는 시간 넉넉하게주기
try {
driver.get(link);
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // Adjust the timeout as needed
// Wait for elements to load
WebElement activityElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".nav-menu-list [data-active='true']")));
if (activityElement != null) {
String activityType = activityElement.getText();
if ("공모전".equals(activityType)) {
processContestActivity(driver,link);
} else if ("대외활동".equals(activityType)) {
processExternalActivity(driver,link);
} else if ("동아리".equals(activityType)) {
processClubActivity(driver,link);
}
}
} finally {
driver.quit(); // Always quit the driver to avoid memory leaks
}
나는 페이지가 로딩되는 시간을 1초로 줬었다. 하지만 서버에 스팩은 나의 노북 및 데스크탑과는 사양이 너무나도 막강하게
달랐기 때문에 중간에 자꾸 크롤링이 멈추는 일이 생겼다. 뭐지뭐지 하다가 chromedriver가 제대로 켜질때까지 시간을 넉넉하게줘서
크롤링하는데 문제없게했다.
📍 EnableScheduling , Scheduling 어노테이션의 이해
@Scheduled
Spring Boot에서 @Scheduled 어노테이션을 사용하면 일정한 시간 간격으로, 혹은 특정 시간에 코드가 실행되도록 설정할 수 있다.
주기적으로 실행해야 하는 작업이 있을 때 적용해 쉽게 사용하자.
@Scheduled 사용법
@Scheduled 어노테이션을 사용하기 위해 다음과 같이 Application Class에 @EnableScheduling을 추가한다.
@Scheduled 속성
fixedDelay : milliseconds 단위로, 이전 Task의 종료 시점으로부터 정의된 시간만큼 지난 후 Task를 실행한다.
fixedRate : milliseconds 단위로, 이전 Task의 시작 시점으로부터 정의된 시간만큼 지난 후 Task를 실행한다.
fixedRate는 작업 수행시간과 상관없이 일정 주기마다 메소드를 호출하는 것이고,
fixedDelay는 (작업 수행 시간을 포함하여) 작업을 마친 후부터 주기 타이머가 돌아 메소드를 호출하는 것이다.
initialDelay : 스케줄러에서 메소드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것이다.
cron : Cron 표현식을 사용하여 작업을 예약할 수 있다.
첫 번째 * 부터
초(0-59)
분(0-59)
시간(0-23)
일(1-31)
월(1-12)
요일(0-6) (0: 일, 1: 월, 2:화, 3:수, 4:목, 5:금, 6:토)
Spring @Scheduled cron은 6자리 설정만 허용하며 연도 설정을 할 수 없다.
Cron 표현식 :
* : 모든 조건(매시, 매일, 매주처럼 사용)을 의미
'AWS' 카테고리의 다른 글
Dynamodb 이슈해결 , 페이지네이션 (0) | 2023.11.06 |
---|---|
nginx port 분리하여 blue/green 배포 (0) | 2023.10.04 |
로드밸런싱 , 다중서버 oauth 401 error (1) | 2023.09.26 |
채팅서비스 sql vs nosql mongodb ? dynamodb ? (0) | 2023.09.10 |
aws codedeploy 블루/그린배포 중 오류 (0) | 2023.09.08 |