인터넷에 있는 다양한 정보를 가져와 사용할 일이 생겼다.
하나하나 수작업으로 하기에는 양이 많을때, 어떻게 하면 좋을까?
selenium 을 이용하여 크롤링하여 수집할 수 있다.
크롤링을 할 때 많이 사용되지만 원래부터 크롤링을 위해 만들어진건 아니였다.
다양한 브라우저와 플랫폼에서 웹 애플리케이션을 검증하기 위해 만들어진 자동화 테스트 프레임워크이다.
동적 페이지 크롤링할 때 많이 사용한다.
크롤링을 위해서 브라우저에 맞는 driver를 설치해야한다.
chrome 을 이용하여 진행할 것이기 때문에 chrome driver 를 설치한다.
더보기(⁝) > 설정 > Chrome 정보
chrome 버전과 동일한 버전의 driver 를 선택한다.
운영체제에 맞게 다운로드 받는다.
다운로드 받은 파일은 원하는 위치에 압축을 푼다.
java 를 이용하여 spring boot 프레임워크에서 학교 공지를 크롤링 해보자.
implementation 'org.seleniumhq.selenium:selenium-java:4.4.0'
SeleniumController
에 크롤링 코드를 작성한다.
1. WebDriver 로드 & 브라우저 띄우기
// 다운로드 받은 driver 위치 주소
// 윈도우 환경
Path path = Paths.get("D:\\chromedriver_win32\\chromedriver.exe");
// 맥 환경
// Path path = Paths.get("/Users/noyewon/Documents/utils/chromedriver");
// chrome driver 세팅
System.setProperty("webdriver.chrome.driver", path.toString());
// 브라우저 선택
WebDriver driver = new ChromeDriver();
// WebDriver 가 로드될때까지 10초 기다림
WebDriverWait webDriverWait = new WebDriverWait(driver, Duration.ofSeconds(10));
// 웹 페이지 띄우기
driver.get(URL);
위의 코드로 실행하면 크롬 실행되고 브라우저가 띄는 것을 볼 수 있다.
옵션(Chrome Option
)을 통해 브라우저를 안띄우는 등 설정할 수 있다.
// 옵션 설정
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-popup-blocking"); // 팝업 안띄움
options.addArguments("headless"); // 브라우저 안띄움
options.addArguments("--disable-gpu"); // gpu 비활성화
options.addArguments("--blink-settings=imagesEnabled=false"); // 이미지 다운 안받음
// 브라우저 선택시 파라미터로 옵션 전송
WebDriver driver = new ChromeDriver(options);
Chrome 에서 F12 를 눌러 개발자 모드에 들어간다.
가져올 데이터가 있는 부분을 찾아 우클릭 > Copy > Copy selector
통해 selector 값을 복사한다.
// 가져올 데이터가 로딩될 때까지 기다림
webDriverWait.until(
ExpectedConditions.presenceOfElementLocated(By.cssSelector("div._fnctWrap > form:nth-child(2) > div > table > tbody > tr"))
);
데이터 로딩이 완료된 후 데이터를 수집한다.
공지는 table > tbody
안에 여러개의 tr
에 있다.
따라서 tr
태그를 모두 가져와 List<WebElement>
에 저장한 뒤 foreach
문을 이용해 공지명과 작성일을 조회한다.
String result = "";
// 공지 데이터가 있는 WebElement 조회
List<WebElement> contents = driver.findElements(By.cssSelector("div._fnctWrap > form:nth-child(2) > div > table > tbody > tr"));
// 공지가 존재하는 경우에만 조회
if(contents.size() > 0) {
for (WebElement content : contents) {
// 공지명과 작성일 가져와 result에 저장
String title = content.findElement(By.cssSelector("td.td-subject > a > strong")).getText();
String date = content.findElement(By.cssSelector("td.td-date")).getText();
result += "공지 title / 작성일 : " + title + "/" + date + "<br />";
}
}
// 브라우저 종료
driver.quit();
// 크롤링 결과 return
return result;
결과 확인
다음과 같이 크롤링이 된 것을 확인할 수 있다.
reference
자바, Spring Boot로 크롤링하기 - Selenium 이용 (동적페이지), 속도 개선 방법