반응형
크롤링을 할 일이 생겨서 도구를 찾던 도중 셀레늄을 써보기로 하였다. 셀레늄은 검색해 보면 많은 소스들이 나오고 대부분 PHP, python으로 많이 구현하는 듯 하지만 자바 연동이 필요하여 자바로 구현했다. (크롤링 도구 확인)
1. 셀레늄이란?
위키 백과에 친절하게 나온다..!
셀레늄(Selenium)은 웹 애플리케이션 자동화 및 테스트를 위한 포터블 프레임워크이다. 셀레늄은 테스트 스크립트 언어를 학습할 필요 없이 기능 테스트를 만들기 위한 플레이백 도구를 제공한다. (셀례늄 IDE) C 샤프, 그루비, 자바, 펄, PHP, 파이썬, 루비, 스칼라 등 수많은 유명 프로그래밍 언어들에서 테스트를 작성하기 위한 테스트 도메인 특화 언어(Selenese)를 제공한다. 이 테스트들은 현대의 대부분의 웹 브라우저에서 수행이 가능하다. 셀레늄은 윈도우, 리눅스, macOS 플랫폼에서 디플로이 된다.아파치 2.0 라이선스로 배포되는 오픈 소스 소프트웨어이다. 웹 개발자는 무료로 다운로드, 사용할 수 있다.
2. 셀레늄 사용 준비
- 사용할 브라우저 선택 및 버전 확인!
- chrome
- 3점 -> 도움말 -> chrome 버전 확인
- chrome://settings/help
- 사용할 브라우저의 driver 다운로드
3. 네이버 로그인 버튼 아이디 확인
- naver.com 접속 후 로그인 버튼의 위치를 확인해 보자
- 크롬 -> F12(개발자도구) -> 타이틀 아래 화살표 클릭 후 NAVER 로그인 초록색 네모 클릭
- <a href> 태그 확인
4. 코드
- build.gradle 셀레늄 JAVA 추가
// 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 가 가장 깔끔.. 이거 하나로 모든 의존성이 처리된다.
- 웬만한 오류는 디펜던시 오류이니 참고하시길 바랍니다.
반응형
'백앤드 이야기 > JAVA&Spring' 카테고리의 다른 글
[JAVA] Checked Exception, Unchecked Exception (0) | 2023.12.14 |
---|---|
[JAVA] URL query parsing, 주소 파라메터 파싱 (0) | 2023.11.16 |
[JAVA] 이름 규칙 (0) | 2023.07.22 |
[JAVA&기타] 네이밍 규칙 (0) | 2022.03.11 |
[JAVA] Optional 기능 메모 (0) | 2021.07.13 |
댓글