https://yuni-spring.35
경기 기록 관리 – 제이솝과 친해지고 싶었다 (1)
기사 작성을 마치고 테스트 목적으로 클랜의 클랜원 목록을 긁어 보았습니다. jsoup는 HTML 코드를 스크랩하는 웹 크롤링 도구입니다. 1. Gradle 구성 구현 ‘org.jsoup:jsoup:1.14.3’ 2. 테스트
yuni-spring.tistory.com
이전 기사에서 Jsoup을 통한 웹 크롤링은 정적 사이트에서만 가능하다는 것을 알았습니다.
동적으로 데이터를 이동시키는 JavaScript가 모두 실행된 후에 html을 가져오는 방법을 생각해내겠다고 했습니다.
그에 대한 답은 ChromeDriver!!!
ChromeDriver 정의 및 역할
자동화된 웹 브라우저 테스트를 작성하거나 웹 사이트 스크래핑을 수행할 수 있습니다.
자동화된 웹 애플리케이션 테스트 및 모니터링, 데이터 수집, 웹 스크래핑 등을 수행할 수 있습니다.
WebDriver API를 사용하여 Java 코드에서 ChromeDriver를 제어할 수 있습니다.
Gradle에 의존성 추가
implementation 'org.seleniumhq.selenium:selenium-java:3.141.59'
implementation 'org.seleniumhq.selenium:selenium-chrome-driver:3.141.59'
전체 흐름부터 시작하겠습니다.
String url = "https://barracks.sa.nexon.com/clan/saddasd222/clanMatch";
String html = htmlDownloader(url);
List<String> clanMembers = ClanMemberParser.parseClanMembers(html);
System.out.println(clanMembers);
for (String member : clanMembers) {
System.out.println(member);
}
(우선 테스트 코드라 클랜 주소를 클랜별로 받는게 아니라 하드코딩 방식으로 구현했습니다)
1. 데이터를 가져올 URL 설정
2. htmlDownloader 메서드 실행
3. parseClanMembers 메서드 실행
4. clanMembers 목록만큼 구성원 확인
2. htmlDownloader에서 1단계에서 설정한 url을 입력하면
public static String htmlDownloader(String url) throws Exception {
//webdriver 프로퍼티 설정
System.setProperty("webdriver.chrome.driver", "/Users/yuni/Documents/chromeDriver/chromedriver");
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless"); // 화면에 브라우저가 보이지 않도록 headless 모드로 실행
WebDriver driver = new ChromeDriver(options);
driver.get(url);
String html = driver.getPageSource();
driver.quit();
return html;
}
–-목이 없는 설정을 넣으면 사용자 인터페이스가 생성되지 않고 코드만 로드됩니다. 더 나은 성능과 메모리 확보할 수있어!!!
3. 2단계에서 받은 html에서 parseClanMembers를 통해 clanMembers를 생성합니다.
public static class ClanMemberParser {
public static List<String> parseClanMembers(String html) throws Exception {
List<String> clanMembers = new ArrayList<>();
//파싱 시작
Document doc = Jsoup.parse(html);
Elements elements = doc.select("a.user-name");
System.out.println(elements);
for (int i = 0; i < elements.size(); i++) {
String nickname = elements.get(i).text();
clanMembers.add(nickname);
}
return clanMembers;
}
}
개발자 도구를 통해 html 코드를 분석해보니 클랜원들의 닉네임을 얻기 위한 a 태그의 사용자명 클래스명을 가지고 있는 것을 발견했다.
따라서 모든 요소는 Jsoup 클래스의 구문에 따라 선택자를 사용하여 로드되었습니다.
그 중 문자만 받아 리스트에 닉네임을 저장해두었습니다.
다만, 이 코드를 그대로 적용하기 위해서는 몇 가지 설정이 필요합니다.
진행하면서 어려운점과 꿀팁 적어둘께요.. 꼭꼭꼭!!
1. ChromeDriver는 현재 Chrome 버전과 일치하는 버전으로 설치해야 하며, Chrome이 너무 최신 버전일 경우 맞지 않을 수 있으며 재설치가 필요할 수 있습니다.
이것이이 오류 코드에서 배운 것입니다.
org.openqa.selenium.SessionNotCreatedException:
session not created: This version of ChromeDriver only supports Chrome version 94
Current browser version is 90.0.4430.72 with binary path
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
Build info: version: '3.141.59', revision: 'e82be7d358',
time: '2018-11-14T08:17:03'
System info: host: 'yunmug-ui-MacBookAir.local',
ip: 'fe80:0:0:0:189b:4e31:229d:8b0f%en0',
os.name: 'Mac OS X', os.arch: 'x86_64',
os.version: '10.16', java.version: '1.8.0_292'
Driver info: driver.version: ChromeDriver
자신의 버전에 맞게 설치할 수 있도록 아래 링크를 남겨둡니다.
https://chromedriver.chromium.org/downloads
ChromeDriver – Chrome용 WebDriver – 다운로드
현재 릴리스 Chrome 버전 113을 사용하는 경우 ChromeDriver 113.0.5672.24를 다운로드하십시오. Chrome 버전 112를 사용하는 경우 ChromeDriver 112.0.5615.49를 다운로드하십시오. Chrome 버전 111을 사용하는 경우 ChromeDriver 111.0.5563.64를 다운로드하십시오.
chromedriver.chromium.org
2. 설치된 chromeDriver의 설치 경로를 설정해야 합니다.
application.properties와 같은 곳에 두는 것이 좋지 않을까요?
테스트 환경이라 하드코딩 해놨는데 이것보다 더 신경써야할게 설치경로!!
htmlDownloader 메서드의 첫 번째 줄
System.setProperty(“webdriver.chrome.driver”, “/Users/yuni/Documents/chromeDriver/chromedriver”);
이렇게 설치 경로를 설정해야 합니다.
한동안 직장에서는 윈도우, 집에서는 맥으로 개발을 하다가 길을 잡는 데 약간의 애로가 있었습니다.
맥의 경우 단말기를 켜고 다음과 같이 크레딧 후 작성!
open -e ~/.zshrc
//문서 -> chromeDriver 폴더
export PATH=$PATH:/Users/yuni/Documents/chromeDriver

결과는 무엇입니까?

요소 -> 텍스트 목록 -> sysout 별명.
기분이 정말 좋습니다..!!!
다음 글에서는 더 많은 게임 관련 정보를 로드할 수 있도록 준비하겠습니다.
이 긴 게시물을 읽어 주셔서 감사합니다!


