코틀린(kotlin)으로 셀레니움(selenium)과 엣지(edge)를 이용해 크롤링(crawling)하기

개요

인텔리제이에서 코틀린과 jsoup으로 웹크롤링을 하던 중, 해결할 수 없는 부분이 발생해 조금 더 직관적이고 정확한 셀레니움(selenium) 크롤링을 시도하게 됐습니다.
엣지브라우저(Microsoft Edge Browser)를 사용하여, 기상청에서 현재 기온을 읽어오는 간단한 예제 구현을 통해서 셀레니움의 사용법을 익히는 것을 목표로 합니다.

셀레니움은 대표적으로 크롬(Google Chrome)이외 인터넷익스플로러(Microsoft Internet Explorer), 사파리(Apple Safari), 불여우(Mozila Firefox)등 거의 모든 웹브라우저를 지원하지만, 이 글에서 엣지(Microsoft Edge)를 사용하여 크롤링하는 특별한 이유는 없습니다.
그냥 제가 엣지를 주력으로 사용하고 크롬과 사용법이 다르지 않기 때문입니다.







개발환경

macOS 11.1 (Intel Mac) 기준

사전 설치된 개발환경

인텔리제이(IntelliJ 2020.3)
OpenJDK-15.0.1
Microsoft Edge Browser(87.0.664.66)

추가 설치될 개발환경

Microsoft Edge WebDriver(87.0.664.66)
selenium-java (4.0.0-alpha-7)







개발환경 설정

엣지 브라우저 버젼 확인

엣지 드라이버 다운로드

셀레니움(JAVA) 다운로드

Microsoft Edge 버젼을 확인하고, 해당 버젼과 동일한 Edge WebDriver를 다운로드 받습니다.
셀레니움(selenium) Java를 다운로드 받습니다.
(Microsoft에 따르면 셀레니움은 크로미움 엣지를 공식지원하는 4.0.0-alpha-5 이후 버젼을 권장한다고 합니다)







인텔리제이 프로젝트 만들기

인텔리제이 실행

인텔리제이 프로젝트 생성1

인텔리제이 프로젝트 생성2

인텔리제이 그래들 디펜던시 추가

인텔리제이를 실행하여 Kotlin-Gradle groovy-runtime(OpenJDK15) 프로젝트를 생성합니다.
프로젝트를 생성한 후 build.gradle의 dependencies을 다음과 같이 변경합니다.

dependencies {
    compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '4.0.0-alpha-7'
}

내용 추가 후 Load Gradle Change(Shift + CMD + L)를 합니다.
디펜던시가 로드된 후,
src -> main -> kotlin에 “Crawler.kt” 파일을 생성합니다.

인텔리제이 소스파일 생성

“Crawler.kt”의 내용은 아래 내용을 복사합니다.

Crawler.kt 소스파일

import org.openqa.selenium.By
import org.openqa.selenium.WebElement
import org.openqa.selenium.edge.EdgeDriver
import org.openqa.selenium.edge.EdgeOptions
import java.lang.Exception

fun main(args: Array<String>) {
    //프로퍼티 설정하기
    val webDriverID = "webdriver.edge.driver"
    val webDriverPath = "/Users/사용자계정/Downloads/edgedriver_mac64/msedgedriver"
    System.setProperty(webDriverID, webDriverPath)

    //엣지드라이버 옵션 설정하기
    val options: EdgeOptions = EdgeOptions()
    options.addArguments("--start-maximized")
    options.addArguments("--disable-popup-blocking")
    options.addArguments("--disable-default-apps")

    //옵션이 적용된 엣지드라이버 불러오기
    val driver: EdgeDriver = EdgeDriver(options)

    try {
        //엣지드라이버로 기상청 메인화면(크롤링할 페이지) 띄우기(가져오기)
        driver.get("https://www.weather.go.kr/w/index.do")

        //현재 날씨부분만 가져오기
        val doc: WebElement = driver.findElement(
            By.xpath("/html/body/div[2]/section/div/div[2]/div[2]/div/div/div[2]/div/div[5]/div[1]/div/div/div[1]/div")
        )

        //가져온 현재 날씨를 콘솔로그에 출력
        println(doc.text)
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        //사용이 끝난 엣지드라이버 종
        driver.close()
    }
}







기상청에서 크롤링할 부분 퍼오기(찾기)

엣지로 기상청 홈페이지 엘리먼트검사1

엣지로 기상청 홈페이지 엘리먼트검사2

xpath 가져오기
엣지로 기상청 홈페이지에 접속하여,
이미지와 같은 방법으로 현재 날씨의 요소 검사를 시행한 뒤
해당 요소의 xpath를 복사합니다.
이미지와 같이 현재 날씨를 읽어오고 싶다면, Crawler.kt:28의
“/html/body/div[2]/section/div/div[2]/div[2]/div/div/div[2]/div/div[5]/div[1]/div/div/div[1]/div”과 같겠지만
혹여나 다른 날씨정보를 가져오고 싶다면 복사한 xpath를 Crawler.kt:28의 By.xpath(“이곳에 복사”)해야 합니다.

Edge WebDriver 경로 가져오기
셀레니움이 엣지브라우져를 가상으로 돌리기 위해, 엣지 웹드라이버가 필요합니다.
이 웹드라이버는 가장 위 단계에서 Mac에 설치된 엣지브라우저 버젼과 동일한 버젼으로 받은 파일입니다.
일반적으로 다운로드 경로를 수정하지 않았다면, 엣지 웹드라이버가 Crawler.kt:10과 같습니다.
Crawler.kt:10의 “사용자계정”은 모두 다 다르므로 자신의 사용자계정을 넣으면 됩니다.


여기까지 모든 준비가 완료됐다면,
해당 소스를 Run(CMD + Option + R 혹은 메뉴(Run) -> Run)합니다.
셀레니움을 통한 기상청 날씨 읽어오기 여기까지 아주 기본적인 셀레니움 + 엣지드라이버 사용법이었습니다.







기타 셀레니움 사용관련 정보

셀레니움 홈페이지 : “https://www.selenium.dev/”
셀레니움 다운로드 : “https://www.selenium.dev/downloads/”
셀레니움 공식 문서(한글) : “https://www.selenium.dev/documentation/ko/getting_started/”
셀레니움 메이븐 레포지토리 : “https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java”
엣지 웹드라이버 설명(공식) : “https://docs.microsoft.com/en-us/microsoft-edge/webdriver-chromium/?tabs=c-sharp”
크롬 웹드라이버 설명(공식) : “https://chromedriver.chromium.org/getting-started”