웹 크롤링이나 스크래핑을 할 때 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
HttpStatusException은 HTTP 상태 코드에 문제가 있을 때 발생하는 예외입니다. 예를 들어, 요청한 페이지가 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이 발생하며, 네트워크 연결 문제를 처리할 수 있습니다. 타임아웃 설정은 크롤러의 성능을 최적화하는 데 유용하며, 네트워크 응답 대기 시간을 효율적으로 제어할 수 있습니다.
참고사이트
'JAVA' 카테고리의 다른 글
[JAVA] JSoup 활용 (자주사용하는 메서드) (0) | 2024.10.29 |
---|---|
[JAVA] JSoup 구글 뉴스 크롤링 예제 (3) | 2024.10.29 |
[JAVA] JSoup의 성능 최적화 (0) | 2024.10.29 |
[JAVA] JSoup AJAX와 동적 페이지 처리 (0) | 2024.10.29 |
[JAVA] JSoup 데이터 전처리와 저장 (1) | 2024.10.28 |
[JAVA] JSoup 데이터 정제 및 변환 (3) | 2024.10.28 |
[JAVA] JSoup HTML 데이터 추출 (0) | 2024.10.28 |
[JAVA] JSoup CSS 선택자 (0) | 2024.10.28 |