백앤드 이야기/JAVA&Spring

[JAVA] 자바로 셀레니움(Selenium)을 구현해보자!(크롤링)

한희성 2023. 10. 28.
반응형

크롤링을 할 일이 생겨서 도구를 찾던 도중 셀레늄을 써보기로 하였다. 셀레늄은 검색해 보면 많은 소스들이 나오고 대부분 PHP, python으로 많이 구현하는 듯 하지만 자바 연동이 필요하여 자바로 구현했다. (크롤링 도구 확인)

 

웹 스크래핑을 더 쉽고 빠르게! 가장 인기 있는 4가지 도구 비밀 공개 | Hashscraper-Blogㅣ해시스크래

인기 있는 웹 스크래핑 도구 4가지(Selenium, Undetected Chromedriver, Playwright, Pyppeteer)에 대한 개요를 확인해보세요. 각 도구의 장점과 단점, 그리고 데이터 추출 프로세스를 개선하는 데 가장 적합한 사

blog.hashscraper.com

 

 

1. 셀레늄이란?

위키 백과에 친절하게 나온다..!

셀레늄(Selenium)은 웹 애플리케이션 자동화 및 테스트를 위한 포터블 프레임워크이다. 셀레늄은 테스트 스크립트 언어를 학습할 필요 없이 기능 테스트를 만들기 위한 플레이백 도구를 제공한다. (셀례늄 IDE) C 샤프, 그루비, 자바, , PHP, 파이썬, 루비, 스칼라 등 수많은 유명 프로그래밍 언어들에서 테스트를 작성하기 위한 테스트 도메인 특화 언어(Selenese)를 제공한다. 이 테스트들은 현대의 대부분의 웹 브라우저에서 수행이 가능하다. 셀레늄은 윈도우리눅스, macOS 플랫폼에서 디플로이 된다.아파치 2.0 라이선스로 배포되는 오픈 소스 소프트웨어이다. 웹 개발자는 무료로 다운로드, 사용할 수 있다.

 

2. 셀레늄 사용 준비

 

Chrome for Testing availability

This page lists the latest available cross-platform Chrome for Testing versions and assets per Chrome release channel. Consult our JSON API endpoints if you’re looking to build automated scripts based on Chrome for Testing release data. Last updated @ 20

googlechromelabs.github.io

3. 네이버 로그인 버튼 아이디 확인

  • naver.com 접속 후 로그인 버튼의 위치를 확인해 보자
  • 크롬 -> F12(개발자도구) -> 타이틀 아래 화살표 클릭 후 NAVER 로그인 초록색 네모 클릭
  • <a href> 태그 확인

 

4. 코드 

    // https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
    implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '4.14.1'

 

  • 사이트 로그인
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.chrome.ChromeOptions;
    import org.springframework.stereotype.Service;
    
    @Slf4j
    @Service
    @RequiredArgsConstructor
    public class SeleniumService {
    
        private WebDriver driver;
        private WebElement element;
    
        // 드라이버 설치 경로
        public static String WEB_DRIVER_ID = "webdriver.chrome.driver";
        public static String WEB_DRIVER_PATH = "C:\\Users\\Administrator\\Downloads\\chromedriver-win64\\chromedriver.exe";
    
        public void testSelenium() {
    
            System.setProperty(WEB_DRIVER_ID, WEB_DRIVER_PATH);
    
            ChromeOptions options = new ChromeOptions();
            options.addArguments("--start-maximized");
            options.addArguments("--disable-popup-blocking");
            options.addArguments("--remote-allow-origins=*"); // org.openqa.selenium.remote.http.ConnectionFailedException : Unable to establish websocket connection to
            driver = new ChromeDriver(options);
    
            String requestUrl = "https://www.naver.com/";
    
            try {
                driver.get(requestUrl);
                Thread.sleep(2000); // 페이지 로딩 시간 동안 기다림
    
                // 로그인 버튼 클릭
                // 2023-10-27 일자 기준의 class 입니다.
                element = driver.findElement(By.className("MyView-module__link_login___HpHMW"));
                element.click();
    
                Thread.sleep(1000);
    
                // 아이디 입력
                element = driver.findElement(By.id("id"));
                element.sendKeys("아이디");
    
                // 비밀번호 입력
                element = driver.findElement(By.id("pw"));
                element.sendKeys("비밀번호");
    
                // 전송
                element = driver.findElement(By.className("btn_login"));
                element.submit();
            }catch (Exception e) {
                e.printStackTrace();
            } finally {
                driver.close(); // 브라우저 종료
            }
        }
    }​
  • 원하는 값 가져오기
    • 원하는 값의 XPath 확인
    • F12 -> 원하는 값 위치 우클릭 -> Copy -> Copy XPath

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor
public class SeleniumService {

    private WebDriver driver;
    private WebElement element;

    // 드라이버 설치 경로
    public static String WEB_DRIVER_ID = "webdriver.chrome.driver";
    public static String WEB_DRIVER_PATH = "C:\\Users\\Administrator\\Downloads\\chromedriver-win64\\chromedriver.exe";

    public void testSelenium() {

        System.setProperty(WEB_DRIVER_ID, WEB_DRIVER_PATH);

        ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized");
        options.addArguments("--disable-popup-blocking");
        options.addArguments("--remote-allow-origins=*"); // org.openqa.selenium.remote.http.ConnectionFailedException : Unable to establish websocket connection to
        driver = new ChromeDriver(options);

        String requestUrl = "https://www.coupang.com/vp/products/6962694234?vendorItemId=84133557119&sourceType=HOME_PERSONALIZED_ADS&searchId=feed-6a2eb8161c4040a3bb30992b27d73b3b-personalized_ads&clickEventId=3835a480-74e0-11ee-b239-6624ba239721&isAddedCart=";

        try {
            driver.get(requestUrl);
            Thread.sleep(2000); // 페이지 로딩 시간 동안 기다림
            
            element = driver.findElement(By.xpath("//*[@id=\"prod-review-nav-link\"]/span[2]"));
            System.out.println("상품평 : [" + element.getText() + "]입니다.");
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.close(); // 브라우저 종료
        }
    }
}

 

5. 마무리

  • 디펜던시 버전이 안 맞아서 20분 정도 삽질했다.. 개발 이해도만 있다면 구현은 1시간 이내로 가능합니다.
  • maven repo에 selenium common과 selenium-chrome-driver 등 여러 가지 lib 가 존재하지만 selenium-java 가 가장 깔끔.. 이거 하나로 모든 의존성이 처리된다.
  • 웬만한 오류는 디펜던시 오류이니 참고하시길 바랍니다.
반응형

댓글

💲 추천 글