Jsoup으로 웹 스크래핑? Java 개발자라면 놓치지 말아야 할 실전 팁
Jsoup으로 웹 스크래핑? Java 개발자라면 이렇게 시작하세요
Java 기반 프로젝트에서 웹 데이터를 긁어와야 할 때, 많은 개발자가 가장 먼저 떠올리는 라이브러리가 Jsoup입니다. Jsoup은 HTML 파서로, DOM 구조를 따라가거나 CSS 선택자를 이용해 원하는 데이터를 추출할 수 있게 해주는 Java 오픈소스 라이브러리입니다.
실제로 야후 파이낸셜의 주식 데이터, 쇼핑몰 상품 정보, 블로그 게시글 등 정적 페이지에서 정형화된 데이터를 뽑아낼 때 매우 유용하게 쓰입니다. 이 글에서는 Jsoup의 기본 사용법부터 실제 프로젝트에 바로 적용할 수 있는 팁까지 다뤄보겠습니다.
Jsoup을 쓰기 전에 반드시 확인할 것
웹 스크래핑을 시작하기 전에, 가장 먼저 확인해야 할 파일이 있습니다. 바로 대상 사이트의 robots.txt입니다.
이 파일은 웹사이트 운영자가 크롤러에게 어떤 경로에 접근해도 되는지, 어떤 경로는 금지하는지 알려주는 규칙입니다.
https://대상사이트.com/robots.txt주소로 접근Disallow항목에서 내가 긁으려는 경로가 금지되어 있는지 확인- 금지된 경로라면 다른 방법을 찾거나 사이트 운영자에게 문의
실제로 야후 파이낸셜의 robots.txt를 확인해보면, 특정 경로가 제한되어 있는 경우가 있습니다. 저는 https://finance.yahoo.com/quote/ 경로에서 코카콜라의 1개월 주기 데이터 테이블을 스크래핑했는데, 이 경로는 robots.txt에서 허용된 범위였기 때문에 문제없이 진행할 수 있었습니다.
robots.txt 규칙을 무시하고 스크래핑할 경우, 법적 문제나 IP 차단으로 이어질 수 있습니다. 반드시 확인 후 진행하세요.
Jsoup 라이브러리 설정부터 연결까지
Gradle 기준 설정
Spring Boot 프로젝트에서 Jsoup을 사용하려면 build.gradle의 dependencies에 아래 코드를 추가합니다.
implementation 'org.jsoup:jsoup:1.17.2'
Maven을 사용한다면 pom.xml에 추가합니다.
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
일반 Java 프로젝트라면 Jsoup 공식 사이트에서 JAR 파일을 다운로드해 lib 폴더에 넣어도 됩니다. 사이트에 연결하고 문서 가져오기
String url = "https://finance.yahoo.com/quote/KO/history/";
Document doc = Jsoup.connect(url)
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)")
.timeout(10000)
.get();
userAgent설정: 기본 Java user-agent는 일부 사이트에서 차단될 수 있으니, 실제 브라우저처럼 보이게 설정합니다.timeout: 연결 제한 시간을 지정합니다. 네트워크 상태에 따라 적절히 조정하세요.
CSS 선택자로 원하는 요소 잡아내기
Jsoup의 강력한 기능 중 하나는 CSS 선택자를 그대로 사용할 수 있다는 점입니다. select() 메서드에 CSS 선택자 문법을 넣으면 해당하는 모든 요소를 Elements 객체로 반환합니다.
Elements rows = doc.select("table tbody tr");
위 코드는 테이블 안의 모든 tr 태그를 가져옵니다. 더 세밀하게 잡고 싶다면 클래스명이나 속성값을 활용합니다.
Elements table = doc.getElementsByAttributeValue("class", "table yf-ewueuo noDl");
이 방식은 class 속성값이 table yf-ewueuo noDl인 요소를 찾습니다. 실제 야후 파이낸셜 페이지에서 원하는 테이블이 이 클래스를 가지고 있었기 때문에 이렇게 설정했습니다.
테이블 내부 데이터 추출 예시
Element table = doc.select("table.yf-ewueuo").first();
Element tbody = table.children().get(1); // thead 다음 tbody
for (Element row : tbody.children()) {
String date = row.child(0).text();
String dividend = row.child(4).text();
if (dividend.endsWith("Dividend")) {
System.out.println(date + " - " + dividend);
}
}
children().get(1): 테이블의 첫 번째 자식은thead, 두 번째가tbody입니다.- 배당금 데이터가 포함된 행만 걸러내기 위해
endsWith("Dividend")조건을 사용했습니다.
자주 마주치는 문제와 해결 방법
1. 동적 콘텐츠가 로드되지 않는 경우
Jsoup은 JavaScript를 실행하지 않습니다. 즉, AJAX로 데이터를 불러오거나 화면 렌더링 후에야 나타나는 콘텐츠는 기본적으로 가져올 수 없습니다.
- 해결: 페이지 소스에서 실제 데이터가 담긴 API 엔드포인트를 찾아 직접 요청
- 또는 Selenium이나 HtmlUnit 같은 헤드리스 브라우저 사용
2. 사이트에서 차단당하는 경우
- User-Agent를 실제 브라우저 값으로 설정
- 요청 간격을 최소 1-2초로 조정
- 회전 프록시 사용 고려
3. HTML 구조가 변경된 경우
사이트가 리뉴얼되면 기존에 사용하던 선택자가 동작하지 않을 수 있습니다. 주기적으로 페이지 구조를 확인하고 선택자를 업데이트하는 로직을 추가하는 것이 좋습니다.
실전에서 써먹는 Jsoup 팁 세 가지
팁 1: Document를 파일로 저장해 디버깅하자
File file = new File("debug.html");
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(doc.outerHtml());
writer.close();
실제 페이지에서 원하는 데이터가 잘 잡히는지 확인할 때, HTML 전체를 파일로 저장해두면 매번 요청하지 않고도 분석할 수 있습니다. 팁 2: 멀티스레드로 여러 페이지를 동시에 긁을 때
ExecutorService executor = Executors.newFixedThreadPool(5);
List<String> urls = Arrays.asList("url1", "url2", "url3");
for (String url : urls) {
executor.submit(() -> {
Document doc = Jsoup.connect(url).get();
// 데이터 처리
});
}
executor.shutdown();
여러 페이지를 순차적으로 긁으면 시간이 오래 걸리므로, 스레드 풀을 이용해 병렬로 처리합니다. 팁 3: 텍스트 외에 속성값도 추출하자
String href = element.attr("href");
String src = element.attr("src");
String dataId = element.attr("data-id");
링크 주소나 이미지 경로, 커스텀 데이터 속성까지 추출할 수 있습니다.
FAQ
Q. Jsoup으로 로그인이 필요한 사이트도 긁을 수 있나요?
로그인이 필요한 사이트는 기본적으로 Jsoup만으로는 어렵습니다. 하지만 로그인 후 발급되는 세션 쿠키를 cookie() 메서드로 설정하면 가능한 경우도 있습니다.
다만, 복잡한 로그인 절차가 있는 사이트라면 HtmlUnit이나 Selenium을 사용하는 것이 더 편리합니다.
Q. Selenium 대신 Jsoup을 써도 될까요?
정적 페이지(JavaScript로 동적 로딩이 없는 사이트)라면 Jsoup이 훨씬 가볍고 빠릅니다. 반면, 무한 스크롤이나 버튼 클릭 후 데이터가 나타나는 사이트는 Selenium이 적합합니다.
용도에 따라 선택하세요.
Q. Jsoup으로 스크래핑한 데이터를 DB에 저장하려면?
JDBC나 JPA를 이용해 직접 저장하면 됩니다. Jsoup으로 추출한 데이터를 DTO 객체에 매핑한 후, MyBatis나 JPA 리포지토리로 INSERT하면 됩니다.
스프링 배치(Spring Batch)와 연계하면 대용량 처리도 가능합니다.
Java로 웹 스크래핑을 해야 하는 상황에서 Jsoup은 가장 접근하기 쉬우면서도 강력한 도구입니다. 단, robots.txt 확인, 요청 간격 조절, JavaScript가 필요한 사이트는 다른 도구와 병행해야 한다는 점만 기억하면 됩니다.
직접 야후 파이낸셜이나 간단한 쇼핑몰 페이지를 대상으로 실습해보면 Jsoup의 동작 방식을 체감할 수 있을 겁니다.



댓글
댓글 쓰기