일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Selenium
- ann
- mysql
- aggs
- Aggregation
- 아이온큐
- dbeaver
- elasticsearch cache
- java
- java crawler
- KNN
- request cache
- NORI
- Cache
- Query
- IONQ
- redis
- API
- Docker
- api cache
- JPA
- TSLA
- Elastic
- Elasticsearch
- 테슬라
- 양자컴퓨터
- aqqle
- Analyzer
- vavr
- file download
Archives
- Today
- Total
아빠는 개발자
[selenium] selenium Async crawler 본문
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 |