조건부 선택을 위한 메서드 사용
JSoup에서는 HTML 문서에서 특정 조건을 만족하는 요소만 선택할 수 있도록 조건부 선택 메서드를 제공합니다. 일반적으로 select 메서드와 함께 사용하는 CSS 선택자뿐만 아니라 hasClass, attr, text 등의 조건 검사를 통해 특정 요소를 보다 정확하게 필터링할 수 있습니다. 이 기능은 데이터를 다룰 때 매우 유용하며, 특히 조건을 만족하는 데이터만 필요한 웹 크롤링에서 큰 도움이 됩니다.
// 특정 클래스 조건으로 요소 필터링 예제
Document doc = Jsoup.connect("http://example.com").get();
Elements elementsWithCondition = doc.select("div").select(".special-class");
for (Element el : elementsWithCondition) {
if (el.hasClass("highlight")) {
System.out.println("조건에 맞는 요소 텍스트: " + el.text());
}
}
위 코드에서는 모든 div 요소 중 special-class 클래스를 가지면서 highlight 클래스가 추가된 요소만 선택해 출력합니다. 이렇게 특정 조건을 적용하여 데이터를 필터링할 수 있으므로, JSoup는 다양한 상황에서 데이터 필터링 기능을 효과적으로 제공합니다.
또한 attr 메서드를 통해 속성 조건도 쉽게 처리할 수 있습니다.
// 속성 조건으로 요소 선택
Elements links = doc.select("a");
for (Element link : links) {
if (link.attr("href").contains("https")) {
System.out.println("https 링크: " + link.attr("href"));
}
}
이 코드는 모든 a 태그 중 href 속성에 https가 포함된 링크만 출력합니다. 속성 조건을 활용하면 링크나 특정 데이터를 효율적으로 선별할 수 있습니다.
반복문을 통한 다중 요소 처리
JSoup는 다수의 요소에 대해 반복 작업을 수행하는 반복문을 활용하여 HTML 문서에서 여러 데이터를 추출할 수 있게 합니다. 반복문을 이용하면, 다수의 동일한 유형의 요소들에 접근하고 데이터를 출력하거나 가공할 수 있습니다. 이러한 기능은 특히 리눅스 환경에서 스크립트 기반 웹 스크래핑 작업에 큰 도움이 됩니다.
// 리스트 형태의 데이터 추출 예제
Elements items = doc.select("ul.product-list > li");
for (Element item : items) {
String productName = item.select(".product-name").text();
String productPrice = item.select(".product-price").text();
System.out.println("상품명: " + productName + ", 가격: " + productPrice);
}
위 코드는 ul.product-list 안에 있는 li 요소들에서 상품명과 가격 정보를 추출하는 예제입니다. 각각의 li 요소에 대해 product-name과 product-price 클래스를 가진 태그의 텍스트를 출력합니다. 대량의 데이터 처리에 반복문을 사용하면, 많은 정보를 한 번에 효과적으로 수집할 수 있습니다.
다음은 조건을 추가한 반복 예제입니다.
// 특정 가격대의 상품만 출력하기
for (Element item : items) {
String productName = item.select(".product-name").text();
String productPrice = item.select(".product-price").text();
if (Integer.parseInt(productPrice.replace("$", "")) < 100) {
System.out.println("100달러 이하 상품명: " + productName);
}
}
이 코드는 가격이 100달러 이하인 상품만 출력하는 예제입니다. 조건을 설정함으로써 필터링된 데이터 추출이 가능하여 필요 없는 데이터를 줄이고 원하는 정보만 다룰 수 있습니다.
URL 재귀 탐색을 통한 심화 크롤링
JSoup를 사용하면 URL 재귀 탐색을 통해 여러 페이지에 걸쳐 심화된 데이터를 크롤링할 수 있습니다. 예를 들어, 페이지 번호가 매겨진 여러 페이지를 크롤링하거나 링크를 따라가며 하위 페이지의 데이터를 추출하는 작업을 수행할 수 있습니다. 이를 통해 크롤러는 단순히 한 페이지의 데이터뿐 아니라 웹사이트 전체에서 연관된 데이터를 모두 수집할 수 있습니다.
// 재귀적으로 URL을 탐색하며 데이터 크롤링
public void crawlPage(String url, int depth) throws IOException {
if (depth > 5) return; // 일정 깊이 이상은 탐색하지 않음
Document doc = Jsoup.connect(url).get();
System.out.println("크롤링 URL: " + url);
Elements links = doc.select("a[href]");
for (Element link : links) {
String absUrl = link.attr("abs:href"); // 절대 경로로 URL 변환
crawlPage(absUrl, depth + 1); // 재귀적으로 링크된 페이지 탐색
}
}
위 코드는 crawlPage라는 메서드를 정의하여 특정 URL을 입력받아 재귀적으로 링크된 페이지를 탐색하며 데이터를 크롤링하는 예제입니다. 이 방법을 통해 URL을 자동으로 이동하며 크롤링할 수 있으므로, 여러 페이지에 걸쳐 데이터가 분산된 경우 매우 유용합니다.
또한, 특정 URL 패턴에 따라 재귀적으로 크롤링할 수 있도록 조건을 추가할 수도 있습니다.
// 특정 도메인에 속하는 URL만 재귀적으로 크롤링
for (Element link : links) {
String absUrl = link.attr("abs:href");
if (absUrl.contains("example.com")) {
crawlPage(absUrl, depth + 1); // 예제 도메인만 탐색
}
}
위 코드처럼 특정 도메인에 속하는 링크만 크롤링할 수 있도록 설정하면 불필요한 URL 접근을 줄이고 대상 사이트 내에서만 크롤링할 수 있습니다. 이렇게 심화 크롤링을 통해 원하는 웹사이트의 다양한 데이터를 효과적으로 수집하고 분석할 수 있습니다.
참고사이트
'JAVA' 카테고리의 다른 글
[JAVA] JSoup AJAX와 동적 페이지 처리 (0) | 2024.10.29 |
---|---|
[JAVA] JSoup 에러 핸들링과 예외 처리 (0) | 2024.10.29 |
[JAVA] JSoup 데이터 전처리와 저장 (1) | 2024.10.28 |
[JAVA] JSoup 데이터 정제 및 변환 (3) | 2024.10.28 |
[JAVA] JSoup CSS 선택자 (0) | 2024.10.28 |
[JAVA] JSoup 기본 사용법 (0) | 2024.10.28 |
[JAVA] JSoup 라이브러리 추가 (Gradle, Maven) (1) | 2024.10.28 |
[JAVA] JSoup 소개 (0) | 2024.10.28 |