[Selenium] 공지 크롤링으로 Selenium 배우기

예원·2022년 9월 27일
0

인터넷에 있는 다양한 정보를 가져와 사용할 일이 생겼다.

하나하나 수작업으로 하기에는 양이 많을때, 어떻게 하면 좋을까?

selenium 을 이용하여 크롤링하여 수집할 수 있다.

selenium 이란?

크롤링을 할 때 많이 사용되지만 원래부터 크롤링을 위해 만들어진건 아니였다.

다양한 브라우저와 플랫폼에서 웹 애플리케이션을 검증하기 위해 만들어진 자동화 테스트 프레임워크이다.

동적 페이지 크롤링할 때 많이 사용한다.


Driver 설치

크롤링을 위해서 브라우저에 맞는 driver를 설치해야한다.

chrome 을 이용하여 진행할 것이기 때문에 chrome driver 를 설치한다.

1. chorme 버전 확인

더보기(⁝) > 설정 > Chrome 정보

2. chrome driver 다운로드

chrome 버전과 동일한 버전의 driver 를 선택한다.

버전 선택

운영체제에 맞게 다운로드 받는다.
운영체제에 맞게 다운로드

다운로드 받은 파일은 원하는 위치에 압축을 푼다.


학교 공지 크롤링하기

java 를 이용하여 spring boot 프레임워크에서 학교 공지를 크롤링 해보자.

Gradle 추가

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);

2. 데이터 가져오기

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 />";
    }
}

3. 브라우저 종료

// 브라우저 종료
driver.quit();

// 크롤링 결과 return 
return result;

결과 확인

다음과 같이 크롤링이 된 것을 확인할 수 있다.
크롤링 성공

전체 코드

selenium 공지 크롤링


reference
자바, Spring Boot로 크롤링하기 - Selenium 이용 (동적페이지), 속도 개선 방법

0개의 댓글