JAVA

[JAVA] JSoup 에러 핸들링과 예외 처리

인생아 2024. 10. 29. 09:14
반응형

웹 크롤링이나 스크래핑을 할 때 JSoup을 사용하면 다양한 상황에서 에러와 예외가 발생할 수 있습니다. 이때 적절한 에러 핸들링예외 처리 로직을 작성하면 크롤러의 안정성을 크게 높일 수 있습니다. JSoup에서 발생할 수 있는 일반적인 예외 유형과 웹 페이지 로딩 오류 대처 방법, 타임아웃 설정 및 재시도 로직 구현 방법에 대해 살펴보겠습니다.

JSoup에서 발생할 수 있는 예외 유형

1. IOException
IOException은 네트워크 문제나 URL이 잘못된 경우에 발생하는 예외입니다. JSoup의 connect() 메서드는 외부 리소스를 요청하기 때문에 인터넷 연결이 원활하지 않거나 잘못된 URL이 주어질 때 IOException이 발생합니다.

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;

public class IOExceptionExample {
    public static void main(String[] args) {
        String url = "http://잘못된url.com";
        try {
            Document doc = Jsoup.connect(url).get();
            System.out.println(doc.title());
        } catch (IOException e) {
            System.out.println("IOException 발생: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

이 코드는 URL을 잘못 입력했을 때 발생하는 IOException을 catch 구문을 통해 처리하는 예제입니다. e.getMessage() 메서드를 사용해 오류 메시지를 출력할 수 있으며, printStackTrace() 메서드를 통해 상세한 에러 정보를 확인할 수 있습니다.

2. IllegalArgumentException
잘못된 형식의 URL을 사용하거나 필수 파라미터가 빠진 경우 발생하는 예외입니다. 주로 connect() 메서드에서 잘못된 URL 형식을 주었을 때 발생합니다.

public class IllegalArgumentExceptionExample {
    public static void main(String[] args) {
        String url = "htp://incorrect-url-format";
        try {
            Document doc = Jsoup.connect(url).get();
        } catch (IllegalArgumentException e) {
            System.out.println("잘못된 URL 형식: " + e.getMessage());
        }
    }
}

JSoup에서 URL 형식이 잘못된 경우 IllegalArgumentException이 발생하므로, 이를 catch 구문에서 처리하여 프로그램의 갑작스러운 종료를 방지할 수 있습니다.

3. HttpStatusException
HttpStatusExceptionHTTP 상태 코드에 문제가 있을 때 발생하는 예외입니다. 예를 들어, 요청한 페이지가 404 Not Found 상태일 때 이 예외가 발생합니다.

import org.jsoup.HttpStatusException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class HttpStatusExceptionExample {
    public static void main(String[] args) {
        String url = "http://example.com/nonexistentpage";
        try {
            Document doc = Jsoup.connect(url).get();
        } catch (HttpStatusException e) {
            System.out.println("HTTP 상태 오류: " + e.getStatusCode());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이 예제는 HttpStatusException을 통해 HTTP 상태 코드를 출력합니다. JSoup에서 상태 코드로 인해 발생하는 예외를 특정하고, 문제가 있는 페이지를 처리하는 데 도움이 됩니다.

반응형

웹 페이지 로딩 오류 대처 방법

웹 페이지 로딩 오류는 네트워크 문제, 서버 다운타임 등 다양한 원인으로 발생할 수 있습니다. 이를 대비하여 재시도 로직을 구현해볼 수 있습니다. 재시도 로직을 통해 웹 페이지 요청이 실패할 경우 일정 횟수만큼 반복해서 시도하게 설정할 수 있습니다.

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;

public class RetryLogicExample {
    public static void main(String[] args) {
        String url = "http://example.com";
        int maxRetries = 3;
        int attempt = 0;

        while (attempt < maxRetries) {
            try {
                Document doc = Jsoup.connect(url).get();
                System.out.println("페이지 로딩 성공: " + doc.title());
                break; // 성공 시 루프 종료
            } catch (IOException e) {
                attempt++;
                System.out.println("페이지 로딩 실패, 재시도 횟수: " + attempt);
                if (attempt == maxRetries) {
                    System.out.println("최대 재시도 횟수 도달, 작업을 중단합니다.");
                }
            }
        }
    }
}

위 코드는 최대 3번까지 재시도를 수행하며, 네트워크 불안정으로 인한 일시적 오류에 대응할 수 있습니다. 재시도 횟수는 상황에 따라 조정 가능하며, 재시도 중 오류가 발생해도 프로그램이 종료되지 않고 계속 진행됩니다.

타임아웃 설정과 재시도 로직 구현

타임아웃 설정은 네트워크 지연 시간에 대해 일정 시간이 초과되면 요청을 중단하게 설정할 수 있는 방법입니다. 타임아웃 설정을 통해 무한 대기 상태를 방지하고, 특정 시간 내에 응답이 없을 경우에만 오류로 처리할 수 있습니다.

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;

public class TimeoutExample {
    public static void main(String[] args) {
        String url = "http://example.com";
        int timeout = 5000; // 5초 타임아웃 설정

        try {
            Document doc = Jsoup.connect(url)
                                .timeout(timeout)
                                .get();
            System.out.println("페이지 로딩 성공: " + doc.title());
        } catch (IOException e) {
            System.out.println("페이지 로딩 실패: " + e.getMessage());
        }
    }
}

timeout 메서드를 통해 5초 타임아웃을 설정합니다. 타임아웃이 설정되면 지정된 시간이 초과했을 때 IOException이 발생하며, 네트워크 연결 문제를 처리할 수 있습니다. 타임아웃 설정은 크롤러의 성능을 최적화하는 데 유용하며, 네트워크 응답 대기 시간을 효율적으로 제어할 수 있습니다.

참고사이트

반응형