아빠는 개발자

[selenium] selenium Async crawler 본문

Java

[selenium] selenium Async crawler

father6019 2023. 9. 2. 12:19
728x90
반응형

비동기는 건강에 해롭다..

컴터가 맛이 갔네..

 

maven 레포지토리에 가보자

https://mvnrepository.com/search?q=selenium

 

셀레니움을 써야 하니까  셀레니움 추가 

build.gradle

dependencies {
 ...
    // https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
    implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.141.0'
...
}

ThreadPoolTaskExecutor 설정 

@Slf4j
@Configuration
@EnableAsync(proxyTargetClass = true)
@RequiredArgsConstructor
public class AsyncConfig implements AsyncConfigurer {

    @Bean(name = "executor")
    public Executor threadPoolItemTaskExecutor() {
        return getExecutor();
    }

    private Executor getExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(4); //기본 쓰레드 사이즈
        taskExecutor.setMaxPoolSize(4); //최대 쓰레드 사이즈
        taskExecutor.setQueueCapacity(5); //Max쓰레드가 동작하는 경우 대기하는 queue 사이즈
        taskExecutor.setThreadNamePrefix("executor_");
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true); //Queue 에 남아있는 작업이완료 될 때까지 기다림
        taskExecutor.setAwaitTerminationSeconds(60); //shutdown 최대 60초 대기
        taskExecutor.initialize();

        return taskExecutor;
    }
}

 

1000 번을 비동기로 호출

for (int i = 0; i < 1000; i++) {
    CompletableFuture<Integer> completableFuture = asyncTaskService.task((i % MAX_NUMBER), url);
    completableFutures.add(completableFuture);
}

 

후딱 하나 만들어 보고 돌려보자

@Slf4j
@Service
@RequiredArgsConstructor
public class AsyncTaskService {

    private static String MOBILE = "Y";

    @Async("executor")
    public CompletableFuture<Integer> task(int i, String url) {
        //(base) ➜  ~ mv -f Downloads/chromedriver /Users/doo/bin/
        System.setProperty("webdriver.chrome.driver", "/Users/doo/bin/chromedriver");
        String userAgent = "Mozilla/5.0 (Linux; Android 9; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.83 Mobile Safari/537.36"; //모바일 에이전트

        // WebDriver 옵션 설정
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized");            // 전체화면으로 실행
        options.addArguments("--disable-popup-blocking");    // 팝업 무시
        options.addArguments("--disable-default-apps");     // 기본앱 사용안함


        Random random = new Random();

        try {

            if (random.nextInt(5) % 2 == 0) {
                MOBILE = "Y";
            } else {
                MOBILE = "N";
            }

            if (MOBILE.equals("Y")) {
                options.addArguments("user-agent=" + userAgent);
            }

            // WebDriver 객체 생성
            ChromeDriver driver = new ChromeDriver(options);

            // 빈 탭 생성
            driver.executeScript("window.open('about:blank','_blank');");
//
//            // 탭 목록 가져오기
            List<String> tabs = new ArrayList<String>(driver.getWindowHandles());

            // 첫번째 탭으로 전환
            driver.switchTo().window(tabs.get(0));
            driver.get(url + i);
            Thread.sleep(1000);

            driver.close();

            driver.quit();
            if (i == 20) {
                i = 8;
            }
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.getStackTrace();
        }


        return CompletableFuture.supplyAsync(()->{
            return 1;
        });
    }

}
728x90
반응형

'Java' 카테고리의 다른 글

Table '{DB}.hibernate_sequence' doesn't exist  (0) 2023.12.24
[java] ThreadPoolTaskExecutor  (0) 2023.12.23
[java] API - redis cache for method TEST  (2) 2023.10.13
[java] CompletableFuture에서 get()과 join()  (0) 2023.08.27
[JPA] UNIQUE 설정  (0) 2023.08.27