https://kingname.tistory.com/221
저번 글에서는 파이썬을 이용하여 스크린샷을 찍는 글을 포스팅 했었습니다. 이번에는 Java를 이용하여 저번에 작성한 파이썬 코드를 Java를 이용하여 보도록 하겠습니다.
우선 아래의 라이브러리를 설치해야합니다. 메이븐레파지토리에서 다운로드가 가능합니다.
// selenium
implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '4.1.0'
// jsoup
implementation group: 'org.jsoup', name: 'jsoup', version: '1.14.3'
이후 파이썬 코드를 컨버팅하여 내용은 이전글과 동일합니다.
public NotionVO saveNotionScreenShotAndGetText(String url) {
WebDriver driver = null;
int totalWidth = 1920;
int totalHeight = 1027;
int timeOutInSeconds = 10;
String htmlSource = "";
String saveImagePath = "";
try {
driver = getWebChromeDriver();
driver.get(url);
changeWindowSize(driver, totalWidth, totalHeight);
// 특정 엘리먼트가 생성될때까지 웹페이지를 기다림
waitVisibilityOfElementLocated(driver, "엘리먼트명", timeOutInSeconds);
sleep(Duration.ofSeconds(3L));
// 특정 클래스의 요소(현재는 스크롤)에 접근하여 데이터 가져오기
WebElement element = driver.findElement(By.className("scroller"));
totalHeight = Integer.parseInt(element.getAttribute("scrollHeight"));
// 크롬 사이즈 변경
changeWindowSize(driver, totalWidth, totalHeight);
sleep(Duration.ofSeconds(2L));
// 데이터 저장 장소
saveImagePath = IMAGE_SAVE_DIR + "notion_" + totalHeight + ".png";
saveScreenshot(driver, saveImagePath);
// Html 데이터
htmlSource = driver.getPageSource();
} catch (Exception e) {
e.printStackTrace();
return NotionVO.builder().url(url).build();
} finally {
if (driver != null) {
driver.close();
}
}
// Jsoup 을 이용하여 텍스트 수집
String content = Jsoup.parse(htmlSource).text();
return NotionVO.builder().content(content)
.contentLength(content.length())
.regDt(LocalDateTime.now())
.ner(nerAnalyzerService.getNerFromText(content))
.screenshotFilePath(saveImagePath)
.url(url)
.build();
}
// 크롬 드라이버
private WebDriver getWebChromeDriver() {
ChromeDriverService service = new ChromeDriverService.Builder()
.usingDriverExecutable(new File(DRIVER_PATH))
.usingAnyFreePort()
.build();
ChromeOptions options = getChromeOptions();
return ChromeDriver.builder()
.withDriverService(service)
.addAlternative(options)
.build();
}
// 크롬 드라이버 옵션
private ChromeOptions getChromeOptions() {
ChromeOptions options = new ChromeOptions();
options.addArguments("headless");
options.addArguments("disable-gpu");
options.addArguments("window-size=1920x1080");
options.addArguments("lang=ko_KR");
options.addArguments("Content-Type=application/json; charset=utf-8");
return options;
}
private void sleep(Duration duration) {
try {
Thread.sleep(duration.toMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void waitVisibilityOfElementLocated(WebDriver driver, String className, int timeOutInSeconds) {
WebDriverWait webDriverWait = new WebDriverWait(driver, timeOutInSeconds);
webDriverWait.until(ExpectedConditions.visibilityOfElementLocated(By.className(className)));
}
private void changeWindowSize(WebDriver driver, int totalWidth, int totalHeight) {
driver.manage().window().setSize(new Dimension(totalWidth, totalHeight));
}
private void saveScreenshot(WebDriver driver, String saveImagePath) {
try {
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File(saveImagePath));
} catch (IOException e) {
e.printStackTrace();
}
}
위 코드를 이용하여 특정 웹 페이지를 스크린샷, 텍스트를 수집할 수 있습니다.