JAVA

[JAVA] JSoup HTML 데이터 추출

인생아 2024. 10. 28. 17:42
반응형

조건부 선택을 위한 메서드 사용

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 접근을 줄이고 대상 사이트 내에서만 크롤링할 수 있습니다. 이렇게 심화 크롤링을 통해 원하는 웹사이트의 다양한 데이터를 효과적으로 수집하고 분석할 수 있습니다.

참고사이트

반응형