블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형
목표
Java와 Selenium을 가지고 웹 크롤러를 만든다.
환경
- Maven 기반의 Java 프로젝트
- Java 버전
OpenJDK 1.8.0_242
Selenium 라이브러리
편의를 위해 Maven
프로젝트로 생성했다. Selenium
라이브러리를 가져온다.
mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
본 글에서는 3.141.59 버전을 사용한다.
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
Chrome Driver 다운로드
위 selenium
버전에서는 Chrome Driver
로 86버전을 사용해야한다.
chromedriver.storage.googleapis.com/index.html?path=86.0.4240.22/
85버전도 가능하긴 하지만, 경고 메세지가 뜬다.
84버전 이하부터는 사용할 수 없고 아래와 같이 오류가 발생한다.
Exception in thread "main" org.openqa.selenium.SessionNotCreatedException: session not created: This version of ChromeDriver only supports Chrome version 84
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
...중략...
Driver info: driver.version: ChromeDriver
...중략...
Java 코드
크롬 드라이버를 가지고 오는 방법에는 2가지 방법이 있다.
- JVM 시스템 속성에 드라이버의 경로를 넣는방법
ChromeDriverService
를 이용하는 방법
System property 사용
// 드라이버 경로
final File driverFile = new File("chromedriver 바이너리 경로");
final String driverFilePath = driverFile.getAbsolutePath();
// 시스템 property 설정
System.setProperty("webdriver.chrome.driver", driverFilePath);
// driver 객체 생성
final WebDriver driver = new ChromeDriver();
ChromeDriverService 사용
// 드라이버 경로 설정
final File driverFile = new File("chromedriver 바이너리 경로");
final String driverFilePath = driverFile.getAbsolutePath();
// ChromeDriverService 서비스 객체 생성
final ChromeDriverService service;
service = new ChromeDriverService.Builder()
.usingDriverExecutable(driverFile)
.usingAnyFreePort()
.build();
try {
service.start();
} catch (IOException e) {
e.printStackTrace();
}
// 드라이버 객체 생성
final WebDriver driver = new ChromeDriver(service);
아래 코드는 구글에 cheese를 검색하고, 더보기 버튼의 텍스트를 가져오는 코드이다.
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.io.File;
import java.io.IOException;
import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args ) {
// 크롬 드라이버를 가지고 옴
final File driverFile = new File("src/main/resources/bin/chromedriver_v86.exe");
final String driverFilePath = driverFile.getAbsolutePath();
if(!driverFile.exists() && driverFile.isFile()) {
throw new RuntimeException("Not found file. or this is not file. <" + driverFilePath + ">");
}
// 방법 1. 시스템 프로퍼티 설정 (JVM이 시작할때 자동으로 설정되는 시스템 속성 값)
// System.setProperty("webdriver.chrome.driver", driverFilePath);
// final WebDriver driver = new ChromeDriver();
// 방법 2. ChromeDriverService를 생성해서 사용
final ChromeDriverService service;
service = new ChromeDriverService.Builder()
.usingDriverExecutable(driverFile)
.usingAnyFreePort()
.build();
try {
service.start();
} catch (IOException e) {
e.printStackTrace();
}
final WebDriver driver = new ChromeDriver(service);
final WebDriverWait wait = new WebDriverWait(driver, 10);
// 크롤링 시작
try {
driver.get("https://google.com/ncr");
Thread.sleep(5000); // Let the user actually see something!
driver.findElement(By.name("q")).sendKeys("cheese" + Keys.ENTER);
final WebElement firstResult = wait.until(presenceOfElementLocated(By.cssSelector("h3>div")));
System.out.println(firstResult.getAttribute("textContent"));
} catch (Exception e) {
e.printStackTrace();
} finally {
// 프로그램이 종료되면 resource 해제
driver.quit();
service.stop();
}
}
}
// 결과값
Show more
Reference
sites.google.com/a/chromium.org/chromedriver/getting-started
반응형
'Language > JAVA' 카테고리의 다른 글
Mac OS에서 JDK 11 설치 (adoptopenjdk11) (0) | 2020.10.30 |
---|---|
Java 파일 존재 여부, 파일 또는 디렉토리 확인하기 (0) | 2020.10.17 |
Maven으로 Java 프로젝트 생성하기 (0) | 2020.09.11 |
Integer.parseInt 와 Integer.valueOf의 차이 (JAVA) (0) | 2020.08.28 |
Java 의 주석 (한 줄 주석, 여러줄 주석, 문서 주석) (0) | 2020.05.29 |