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
반응형